【发布时间】:2013-09-11 17:15:19
【问题描述】:
我目前正在修复其他人的 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,因为只执行第一个 sn-p 中 else 块内的代码。
那么,这个 if 语句怎么会这样呢?是短路失败,还是我误解了原理,或者这部分代码有什么完全不同的错误? (除了缺少对subowner 的空检查,即在此部分之外完成。)
【问题讨论】:
-
对我来说短路了。你用的是什么Java版本?无论如何
DEBUG_ENABLED可能是true? -
请描述您运行此程序的环境以及您知道它没有短路的准确程度。
-
我也短路了,你100%确定
DEBUG_ENABLED == false吗? -
||表示如果subowner.equals返回true,handleCommand仍然必须检查。由于存在 OR 子句,如果一侧为假,则仍必须检查另一侧。DEBUG_ENABLED使||的左侧为假,但右侧仍然可以为真。 -
哇,反应快。嗯,我们是1.6。至于不短路,如果在
handleCommand函数中找到匹配项,它会显示一些文本或执行操作。每次测试时,都会见证这些动作,以及第一个 sn-p 中 else 部分中的动作。 (如果 if 语句评估为 true,则不会显示正在执行的任何操作。)
标签: java short-circuiting