布尔值中操作数的顺序是否有效?

时间:2012-05-08 14:14:21

标签: java boolean

布尔值中操作数的顺序是否会影响评估顺序?我可以依靠

作为一个例子
String s = ...;
if (s != null && s.length() > 10) ...

我似乎记得Java语言没有定义评估顺序,而s的空值可能会导致NPE。这仍然是正确的(a)原则上和(b)在实践中使用常见的Java实现吗?

更新: 我找不到确切的副本。有趣的是看到答案中的意见分歧并得到它的支持 - 嗯好!

4 个答案:

答案 0 :(得分:5)

是的,这很重要,

  

... Java语言没有定义评估顺序

不是真的。参数从左到右进行评估,因此像s != null && s.length() > 10这样的表达式永远不会抛出NullPointerException

请参阅Java语言规范中的15.7 Expressions - Evaluation Order

答案 1 :(得分:2)

不,这不是真的。这是避免空指针异常的正确方法。评估操作数,仅在表达式的值仍未清除时才评估下一个操作数。

这意味着:

  • 如果你有一个和运算符(&&)并且第一个操作数的计算结果为false,那么第二个操作数将不会被评估。
  • 如果您有一个或运算符(||)且第一个操作数的计算结果为true,则不会计算第二个操作数。

答案 2 :(得分:2)

Java和许多其他语言支持布尔语句的Short Circuit Evaluation

&&||

在Java中,&&||是短路布尔运算符。如果你使用这些,只有在必要时才会评估第二个参数,以确定该陈述的真值。

&|

在Java中,按位运算符&|也是非短路布尔运算符。如果使用它们,将始终评估两个参数。

答案 3 :(得分:0)

它被称为短路逻辑和操作,这意味着&&之后的部分永远不会被评估,如果之前的部分要返回false

我们甚至还有短路逻辑或操作,如果之前的那部分要返回||,则不会评估true之后的部分。

此类操作数通常用于null检查,如您发布的示例所示。

如果您在snull的情况下执行以下操作(正常和操作员),则结果将是灾难性的。

if (s != null & s.length() > 10)

这是因为即使s.length()返回s != nullfalse还会继续尝试进行评估,导致NullPointerException s.length()。但是,对于短路版本,第二部分将被完全跳过。