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