为什么这段代码是错误的?当我将"else if(this.power >= p)"
更改为仅"else"
时,是正确的。有人可以给我提示吗?
public boolean useBattery(double p) {
if(this.power < p) {
this.power = 0.0;
return false;
} else if(this.power >= p) {
this.power = this.power - p;
return true;
}
}
最佳答案
对于阅读该代码的人类读者来说,似乎是第一个return
将被命中,第二个将被命中,但是编译器无法确定。对于编译器,它看起来像:
if (condition1) {
...
return false;
} else if (condition2) {
...
return true;
}
它需要知道,如果
condition1
和condition2
都不为真,该方法将返回什么?而如果将其更改为直线
else
,if (condition1) {
...
return false;
} else {
...
return true;
}
那么可以确定必须击中两个
return
语句之一。实际上,在您的方法中,有可能两个条件都不满足:如果您要比较的数字之一是
NaN
(表示“非数字”的特殊浮点值),则您的两个if
条件将为false,并且该方法将没有返回值。从理论上讲,在另一个线程中运行的某些代码也可能会在第一次
this.power
检查和第二次检查之间更改if
的值,这可能导致两个条件的评估结果均为false。因此,即使在逻辑上是互补的,编译器也无法确定要满足其中一个条件。