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