Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么';这个if语句不是短路了吗?_Java_Short Circuiting - Fatal编程技术网

Java 为什么';这个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)) { ....

我目前正在修复其他人的Java代码中的一个bug,但我无法解释这个bug。问题代码为以下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\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()){}