布尔值中操作数的顺序会影响求值顺序吗?作为一个例子,我可以依靠
String s = ...;
if (s != null && s.length() > 10) ...
我似乎记得 Java 语言没有定义评估顺序,并且 null 值s
可能导致 NPE。(a)原则上和(b)在常见的 Java 实现中仍然如此吗?
更新:我找不到确切的副本。有趣的是看到答案中的意见分歧并获得反对票 - 嗯!
是的,这很重要
... Java 语言没有定义评估顺序
不是真的。参数是从左到右计算的,所以像这样的表达式s != null && s.length() > 10
永远不会抛出NullPointerException
.
请参阅Java 语言规范中的15.7 表达式 - 评估顺序。
不,这不是真的。这是避免空指针异常的正确方法。仅当表达式的值仍不清楚时,才计算一个操作数,并计算下一个操作数。
这意味着:
Java 和许多其他语言支持布尔语句的短路求值。
&&
和||
在 Java 中,&&
和||
是短路布尔运算符。如果您使用这些,则只有在确定语句的真值所必需的情况下才会评估第二个参数。
&
和|
在 Java 中,按位运算符&
和|
也是非短路布尔运算符。如果使用它们,将始终评估两个参数。
它被称为短路逻辑和运算,这意味着&&
如果前面的部分要返回,则永远不会评估后面的部分false
。
我们甚至有短路逻辑或操作,它不会评估||
if 之前的部分之后的部分 return true
。
此类操作数通常用于null
您发布的示例中的检查。
s
如果您要使用being执行以下(正常和运算符)null
,结果将是灾难性的。
if (s != null & s.length() > 10)
这是因为即使返回 as.length()
也会继续尝试评估,导致 a on 。但是,对于短路版本,将完全跳过第二部分。s != null
false
NullPointerException
s.length()