假设我有以下表达式:
String myString = getStringFromSomeExternalSource();
if (myString != null && myString.trim().length() != 0) {
...
}
Eclipse警告我,在布尔表达式的第二个短语中myString
可能为null。然而,我知道有些编译器如果第一个条件失败,则会完全退出布尔表达式。Java也是这样吗?或者求值的顺序不能保证?
假设我有以下表达式:
String myString = getStringFromSomeExternalSource();
if (myString != null && myString.trim().length() != 0) {
...
}
Eclipse警告我,在布尔表达式的第二个短语中myString
可能为null。然而,我知道有些编译器如果第一个条件失败,则会完全退出布尔表达式。Java也是这样吗?或者求值的顺序不能保证?
然而,我知道有些编译器如果第一个条件失败,就会完全退出布尔表达式。Java也是这样吗?
是的,这被称为短路求值。像&&
和||
这样的运算符执行此类操作。
或者说,评估顺序不能保证吗?
不,评估顺序是有保证的(从左到右)。
Java应该从左到右评估您的语句。它使用一种被称为短路求值的机制,以防止第二个、第三个和第n个条件在第一个条件为false时被测试。
因此,如果您的表达式是myContainer != null && myContainer.Contains(myObject)
并且myContainer
为空,则第二个条件myContainer.Contains(myObject)
将不会被评估。
编辑:正如其他人提到的,特别是对于布尔条件,Java确实具有短路和非短路运算符。使用&&
将触发短路求值,而&
则不会。
||
,则编译器无法仅从第一个条件得出整个值,如果第一个条件为 false。 - H2ONaClJames和Ed都是正确的。如果你遇到一个情况,希望所有表达式都被评估而不考虑之前失败的条件,你可以使用非短路布尔运算符&
。