【问题标题】:Why doesn't this if-statement short circuit?为什么这个 if 语句不短路?
【发布时间】: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 返回truehandleCommand 仍然必须检查。由于存在 OR 子句,如果一侧为假,则仍必须检查另一侧。 DEBUG_ENABLED 使|| 的左侧为假,但右侧仍然可以为真。
  • 哇,反应快。嗯,我们是1.6。至于不短路,如果在 handleCommand 函数中找到匹配项,它会显示一些文本或执行操作。每次测试时,都会见证这些动作,以及第一个 sn-p 中 else 部分中的动作。 (如果 if 语句评估为 true,则不会显示正在执行的任何操作。)

标签: java short-circuiting


【解决方案1】:

&& 操作符不可能短路。你可能在使用& 吗?如果不是,则意味着您做出了一些错误的假设,即最后一个条件之前的条件是错误的。

【讨论】:

  • 第一个 sn-p 是代码的直接副本,初始化也是如此。我检查了DEBUG_ENABLED 是否在代码中的其他任何地方以任何方式被修改或本地声明,但事实并非如此。第二个 sn-p 已被修改,但只是为了在传达想法的同时缩短它。
  • @user2757672 您不能在代码中直接在条件上或之前放置断点并验证每个条件的计算结果是否为假吗?
  • 我可以确认DEBUG_ENABLED 是假的。但是,您建议检查每个条件以及如果它们是错误的会发生什么,这很有趣。也许这会告诉我是什么原因造成的。
  • @user2757672,如果其中一个条件在最后一个条件之前评估为 false 并且操作员没有短路,则解释器有问题。测试是你自己,if (false && true && someFunction()) {}
猜你喜欢
  • 2012-09-10
  • 2021-08-20
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多