【问题标题】:Boolean expression order of evaluation in Java?Java中评估的布尔表达式顺序?
【发布时间】:2010-01-08 15:41:24
【问题描述】:

假设我有以下表达式

String myString = getStringFromSomeExternalSource();
if (myString != null && myString.trim().length() != 0) {
...
}

Eclipse 警告我 myString 在布尔表达式的第二个短语中可能为空。但是,我知道一些编译器会在第一个条件失败时完全退出布尔表达式。 Java 是这样吗?还是不保证评估顺序?

【问题讨论】:

  • 您使用的是哪个编译器或工具?
  • 好吧,javac(最常见的编译器)不会警告空值。如果“Java 警告我 myString 可能为空”,那很可能是一个有问题的工具。没有“java 警告”之类的东西。
  • 这是有效的,@notnoop。我正在使用 Eclipse。我的语言很草率。
  • 在 Eclipse 中,我只能用 || 重现警告操作或使用“myString == null”。你确定 Eclipse 警告过这个代码 sn-p 吗?

标签: java compiler-warnings boolean-logic boolean-expression


【解决方案1】:

但是,我知道有些编译器会在第一个条件失败时完全退出布尔表达式。 Java 是这样吗?

是的,这就是所谓的Short-Circuit evaluation。像&&|| 这样的运算符就是执行此类操作的运算符。

还是不能保证评估的顺序?

不,保证评估顺序(从左到右)

【讨论】:

    【解决方案2】:

    Java 应该从左到右评估您的语句。它使用一种称为short-circuit evaluation 的机制来防止在第一个条件为假时测试第二个、第三个和第n 个条件。

    因此,如果您的表达式为 myContainer != null && myContainer.Contains(myObject)myContainer 为 null,则不会计算第二个条件 myContainer.Contains(myObject)

    编辑:正如其他人所提到的,Java 确实有用于布尔条件的短路和非短路运算符。使用&& 将触发短路评估,而& 不会。

    【讨论】:

    • 引用:To prevent the second, third, and nth conditions from being tested if the first is false。实际上,如果运算符是||,如果第一个为假,编译器无法单独从第一个得出整体值。
    【解决方案3】:

    詹姆斯和埃德是正确的。如果您遇到一种情况,您希望在不考虑先前失败条件的情况下评估所有表达式,您可以使用非短路布尔运算符&

    【讨论】:

      【解决方案4】:

      是的,Java 以这种方式对 if 语句进行惰性求值。如果 myString==null,则不会计算 if 语句的其余部分

      【讨论】:

        猜你喜欢
        • 2018-06-06
        • 2013-12-15
        • 1970-01-01
        • 2017-12-26
        • 2012-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-08
        相关资源
        最近更新 更多