27

假设我有以下表达式

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

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

4

4 回答 4

46

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

是的,这被称为短路评估。操作员喜欢&&并且||是执行此类操作的操作员。

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

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

于 2010-01-08T15:44:45.800 回答
8

Java 应该从左到右评估您的语句。它使用一种称为短路评估的机制来防止在第一个条件为假的情况下测试第二个、第三个和第 n 个条件。

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

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

于 2010-01-08T15:43:31.183 回答
2

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

于 2010-01-08T15:45:26.757 回答
1

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

于 2010-01-08T15:42:47.753 回答