我目前正在修复别人的Java代码中的一个错误,但我无法解释这个错误。涉及到的代码是下面的if语句:
if (locked && DEBUG_ENABLED
&& owner != null
&& (owner.equals(playerName) || subowner.equals(playerName))
&& handleCommand(playerName, message)) {
....
} else {
....
}
DEBUG_ENABLED
被初始化为 private static boolean DEBUG_ENABLED = false;
,而 handleCommand
函数的运作方式如下:
public boolean handleCommand(String name, String msg) {
if(msg.equals("Command1")) {
....
} else if(msg.equals("Command2")) {
....
} ....
} else { // No matching command
return false;
}
return true;
}
我困惑的是,尽管
DEBUG_ENABLED
被设置为false,代码仍然调用并执行handleCommand
函数。我一直认为这不应该发生,因为应该会短路。if语句本身总体上仍然被评估为false,因为只有第一个片段中else块内的代码被执行。
那么,为什么这个if语句会表现出这样的行为呢?它是否未能实现短路,还是我对原则的理解有误,或者这段代码完全有其他问题?(除了缺少对
subowner
的空值检查之外,该检查在此部分之外完成。)
DEBUG_ENABLED
是true
? - Sotirios DelimanolisDEBUG_ENABLED == false
是100%正确的吗? - BackSlashsubowner.equals
返回true
,仍然必须检查handleCommand
。由于有一个 OR 子句,如果一侧为 false,则仍必须检查另一侧。DEBUG_ENABLED
使||
左侧为 false,但右侧仍可能为 true。 - David SchwartzhandleCommand
函数中找到匹配项,则会显示一些文本或执行某些操作。每次测试时都可以看到这些操作,以及第一个代码段中else部分的操作。(如果if语句评估为true,则不会显示任何执行的操作。) - user2757672()
将||
隔离开来,并且通用条件是一系列的&&
。这个假设对吗? - user2757672