Java返回布尔错误

时间:2012-08-23 02:02:39

标签: java methods boolean return collision

我是java语言的新手,我很困惑为什么我在这里收到错误。 这是一段很短的代码,我似乎有一个心理障碍。 有什么建议吗?

public class Rigidbody {
    public boolean checkCircleCollision(float x1,float y1,float size1,float x2,float y2,float size2){
        if(Math.sqrt(((x2-x1)^2)+((y2-y1)^2))<=(size1+size2)){
            return true;
        }
    }
}

有谁知道我在这里缺少什么? (这可能很明显)。

6 个答案:

答案 0 :(得分:14)

嗯,首先,you forgot to have an else clause

public boolean checkCircleCollision(float x1, float y1, float r1,
    float x2, float y2, float r2) {
  if (Math.sqrt(((x2 - x1) ^ 2) + ((y2 - y1) ^ 2)) <= (r1 + r2)){
    return true;
  } else {
    return false;
  }
}

Someone else already pointed out这可以缩短如下:

public boolean checkCircleCollision(float x1, float y1, float r1,
    float x2, float y2, float r2) {
  return Math.sqrt(((x2 - x1) ^ 2) + ((y2 - y1) ^ 2)) <= (r1 + r2);
}

(确保赞成将它们指出: - )


但是,您的代码仍然存在错误。

如上所述here,Java的^运算符用于独占按位OR ,而不是取幂。也许你想要Math.pow()

  

返回第一个参数的值,该值是第二个参数的幂。

public boolean checkCircleCollision(float x1, float y1, float r1,
    float x2, float y2, float r2) {
  return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)) <= (r1 + r2);
}

或者,您也可以使用Math.hypot而不是自己动手!

  

返回sqrt(x ^ 2 + y ^ 2)而没有中间上溢或下溢。

public boolean checkCircleCollision(float x1, float y1, float r1,
    float x2, float y2, float r2) {
  return Math.hypot(x2 - x1, y2 - y1) <= (r1 + r2);
}

答案 1 :(得分:11)

你可以让方法的身体更简单......

public class Rigidbody {
    public boolean checkCircleCollision(float x1,float y1,float size1,float x2,float y2,float size2){
        return Math.sqrt(((x2-x1)^2)+((y2-y1)^2))<=(size1+size2)    
    }
}

<=的结果始终是布尔值。

答案 2 :(得分:9)

您忘记了else的{​​{1}}部分。

if

可以简化为:

public boolean checkCircleCollision(float x1,float y1,float size1,float x2,float y2,float size2){
    if (Math.sqrt(Math.pow(x2-x1, 2)+ Math.pow(y2-y1,2)) <= (size1+size2)) {
        return true;
    } else {
        return false;
    }
}

编辑:另外,正如 @veer 所述,当您使用public boolean checkCircleCollision(float x1,float y1,float size1,float x2,float y2,float size2){ return Math.sqrt(Math.pow(x2-x1, 2)+ Math.pow(y2-y1,2)) <= (size1+size2); } 时,您正在使用^2,因为{{ Java中的运算符是按位异或,而不是幂运算符。所以去 upvote并接受他的answer ,因为这是导致错误的主要原因。

答案 3 :(得分:2)

试试这个,我使用了Math.pow作为方块。还为else条件添加了return语句。

        public class Rigidbody {

     public boolean checkCircleCollision(float x1,float y1,float size1,float x2,float                     y2,float size2){
            return (Math.sqrt(Math.pow((x2-x1), 2) + Math.pow((y2-y1), 2)) <= (size1+size2));   
     } }

答案 4 :(得分:2)

OP在他/她的代码中存在问题,因为^符号用法应该被Math#pow()替换,每个人都有好处!但他/她正在询问缺少什么。答案非常简单:每个方法都必须为void方法返回之外的值。

如果你有

public boolean aBooleanMethod(int x) {
    //some fancy and nice code!
    return true;
}

编译器会很高兴。但是,如果你做这样的事情:

public boolean anotherBooleanMethod(int x) {
    if (x < 2) {
        return true;
    }
}

编译器将抛出异常:

  

此方法必须返回boolean类型的结果。

这是为什么?因为在方法结束时,编译器找到一个无法返回值的路径,所以不要让程序崩溃或返回意外的结果(如没有返回关联时的false),Java编译器将抛出异常。

如何解决?简单:不要忘记在方法的每个路径上返回值

在最后一段代码中解决问题的方法:

  1. 在方法的末尾添加默认return。这是几乎所有程序员都使用的常用方法。

    public boolean anotherBooleanMethod(int x) {
        if (x < 2) {
            return true;
        }
        //if the method has never returned true, then it must return false...
        return false;
    }
    
  2. 对于布尔结果,您可以返回一个条件:

    public boolean anotherBooleanMethod(int x) {
        //your method always return a value, no compiler problems
        //the value depends if x is less than 2 (true) or 2 or more (false)
        return (x < 2);
    }
    
  3. 关于void方法的例外,这并不意味着void方法不能使用return关键字,只是意味着它必须返回“nothing”。发布样本:

    public void theVoidMethod(int x) {
        System.out.println("Welcome to theVoidMethod!");
        if (x < 2) {
            //return nothing! End of the method
            return;
        }
        System.out.println("You've reached the bottom of theVoidMethod!");
        //here, the Java compiler will add a return sentence for you, no need to code it
        //return
    }
    

    如果使用1和2作为参数测试此方法,您将得到不同的结果:

    theVoidMethod(1):

    Welcome to theVoidMethod!
    

    theVoidMethod(2):

    Welcome to theVoidMethod!
    You've reached the bottom of theVoidMethod!
    

    现在,要解决代码中的其他问题,您应该使用Math#pow方法而不是^符号,但在其他答案中对此进行了大量解释。

答案 5 :(得分:0)

当该条件为假时,它不会返回任何错误原因。

public class Rigidbody {
public boolean checkCircleCollision(float x1,float y1,float size1,float x2,float y2,float size2){
    if(Math.sqrt(((x2-x1)^2)+((y2-y1)^2))<=(size1+size2)){
        return true;
    }
    else{
        return false
    }
}
}