Java 为什么';这个if语句不是短路了吗?
我目前正在修复其他人的Java代码中的一个bug,但我无法解释这个bug。问题代码为以下if语句:Java 为什么';这个if语句不是短路了吗?,java,short-circuiting,Java,Short Circuiting,我目前正在修复其他人的Java代码中的一个bug,但我无法解释这个bug。问题代码为以下if语句: if (locked && DEBUG_ENABLED && owner != null && (owner.equals(playerName) || subowner.equals(playerName)) && handleCommand(playerName, message)) { ....
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\u ENABLED
设置为false,代码仍然调用并执行handleCommand
函数。我一直认为这不应该发生,因为短路。
if语句本身的总体计算结果仍然为false,因为只执行第一个代码段中else块内的代码
那么,为什么这个if语句的行为是这样的呢?是短路失败,还是我误解了原理,还是这部分代码有完全不同的错误?(除了对
子所有者的缺失空检查(即在本部分之外进行的检查)。操作员不可能短路。您是否使用了&
?如果不是,那就意味着你做了一些错误的假设,认为上一个条件之前的条件是错误的。这对我来说是短路。您使用的是什么Java版本?还有,是否有DEBUG\u ENABLED
可能是true
?请描述您运行此程序的环境,以及您如何准确地知道它不是短路。它对我来说也是短路,您是否100%确定DEBUG_ENABLED==false
?|
表示如果subowner.equals
返回true
,则仍必须选中handleCommand
。由于存在OR子句,如果一方为false,则必须检查另一方DEBUG_ENABLED
使|
的左侧为false,但右侧仍然可以为true。哇,快速响应。嗯,我们在1.6。至于不短路,如果在handleCommand
功能中找到匹配项,它将显示一些文本或执行一个操作。每次测试时,都会看到这些操作,以及第一个代码片段中else部分中的操作。(如果if语句的计算结果为true,则不会显示从中执行的任何操作。)第一个代码段与初始化一样,是代码的直接副本。我已经检查了DEBUG\u ENABLED
是否在代码中的任何其他地方被修改或本地声明,但事实并非如此。第二个代码段已被修改,但只是为了在传达想法的同时缩短它。@user2757672您能否在代码中直接在条件上或之前放置一个断点,并验证每个条件的计算结果是否为false?我可以确认DEBUG\u ENABLED
为false。然而,你的建议是检查每一个条件,如果它们是错误的,会发生什么,这很有趣。也许这会告诉我是什么原因。@user2757672,如果其中一个条件在最后一个条件之前计算为false,并且操作员没有短路,则说明解释器有严重问题。测试就是你自己,if(false&&true&&someFunction()){}