Java中的布尔表达式评估顺序?

时间:2010-01-08 15:41:24

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

假设我有以下表达式

String myString = getStringFromSomeExternalSource();
if (myString != null && myString.trim().length() != 0) {
...
}
Eclipse警告我,myString在布尔表达式的第二个短语中可能为null。但是,我知道有些编译器会在第一个条件失败时完全退出布尔表达式。这对Java来说是真的吗?或者评估顺序不能得到保证?

4 个答案:

答案 0 :(得分:45)

  

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

是的,这被称为Short-Circuit evaluation&&||等运营商是执行此类操作的运营商。

  

或评估顺序无法保证?

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

答案 1 :(得分:7)

Java应该从左到右评估你的陈述。它使用一种称为short-circuit evaluation的机制来防止第一,第三和第n个条件在第一个条件为假时被测试。

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

编辑:正如其他人所提到的,Java特别为布尔条件提供了短路和非短路运算符。使用&&将触发短路评估,而&则不会。

答案 2 :(得分:2)

詹姆斯和艾德是对的。如果您遇到一个案例,您希望无论先前的失败条件如何都要评估所有表达式,您可以使用非短路布尔运算符&

答案 3 :(得分:1)

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