我的退货声明有什么问题?

Jac*_*kie 1 java if-statement

为什么这段代码错了?当我"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;
    }
}
Run Code Online (Sandbox Code Playgroud)

khe*_*ood 6

对于查看代码的人类读者来说,似乎第一个return将被命中,或者第二个,但编译器无法确定.对于编译器,它看起来像:

 if (condition1) {
     ...
     return false;
 } else if (condition2) {
     ...
     return true;
 }
Run Code Online (Sandbox Code Playgroud)

并且它需要知道,如果既不是condition1也不condition2是真的那么该方法会返回什么?

如果你改成直线else,

if (condition1) {
    ...
    return false;
} else {
    ...
    return true;
}
Run Code Online (Sandbox Code Playgroud)

那么肯定return必须击中两个陈述中的一个.

实际上在你的方法中,有可能不会满足任何条件:如果你要比较的数字之一是NaN(表示"不是数字"的特殊浮点值),那么你的两个if条件都将是假的,并且方法没有返回值.

从理论上讲,在另一个线程中运行的某些代码可能会改变this.power第一个if检查和第二个检查之间的值,这可能导致两个条件评估为false.因此,编译器无法确定是否满足其中一个条件,即使它们逻辑上是互补的.