-1

布尔值中操作数的顺序会影响求值顺序吗?作为一个例子,我可以依靠

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

我似乎记得 Java 语言没有定义评估顺序,并且 null 值s可能导致 NPE。(a)原则上和(b)在常见的 Java 实现中仍然如此吗?

更新:我找不到确切的副本。有趣的是看到答案中的意见分歧并获得反对票 - 嗯!

4

4 回答 4

5

是的,这很重要

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

不是真的。参数是从左到右计算的,所以像这样的表达式s != null && s.length() > 10永远不会抛出NullPointerException.

请参阅Java 语言规范中的15.7 表达式 - 评估顺序

于 2012-05-08T14:16:24.407 回答
2

不,这不是真的。这是避免空指针异常的正确方法。仅当表达式的值仍不清楚时,才计算一个操作数,并计算下一个操作数。

这意味着:

  • 如果您有一个 and 运算符 (&&) 并且第一个操作数的计算结果为 false,则不会计算第二个操作数。
  • 如果您有 or 运算符 (||) 并且第一个操作数的计算结果为 true,则不会计算第二个操作数。
于 2012-05-08T14:15:18.930 回答
2

Java 和许多其他语言支持布尔语句的短路求值。

&&||

在 Java 中,&&||是短路布尔运算符。如果您使用这些,则只有在确定语句的真值所必需的情况下才会评估第二个参数。

&|

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

于 2012-05-08T14:19:15.787 回答
0

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

我们甚至有短路逻辑或操作,它不会评估||if 之前的部分之后的部分 return true

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

s如果您要使用being执行以下(正常和运算符)null,结果将是灾难性的。

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

这是因为即使返回 as.length()也会继续尝试评估,导致 a on 。但是,对于短路版本,将完全跳过第二部分。s != nullfalseNullPointerExceptions.length()

于 2012-05-08T14:17:32.977 回答