我是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;
}
}
}
有谁知道我在这里缺少什么? (这可能很明显)。
答案 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编译器将抛出异常。
如何解决?简单:不要忘记在方法的每个路径上返回值。
在最后一段代码中解决问题的方法:
在方法的末尾添加默认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;
}
对于布尔结果,您可以返回一个条件:
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);
}
关于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
}
}
}