为什么这段代码是错误的?当我将"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;
 }


它需要知道,如果condition1condition2都不为真,该方法将返回什么?

而如果将其更改为直线else

if (condition1) {
    ...
    return false;
} else {
    ...
    return true;
}


那么可以确定必须击中两个return语句之一。

实际上,在您的方法中,有可能两个条件都不满足:如果您要比较的数字之一是NaN(表示“非数字”的特殊浮点值),则您的两个if条件将为false,并且该方法将没有返回值。

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

10-07 19:07
查看更多