2

我在这行代码中找到了问题。忽略这段代码没有意义的事实:

if (object != null || object.someMethod()) object.doSomething();

NullPointerException首先,我在想如果对象为空,这段代码会抛出。但是,这是一个逻辑析取,如果其中一个条件为真,则整个条件为真。所以编译器不会检查第二个条件,也不会 throws NullPointerException

这是 Java 标准行为或实现特定的吗?如果第二种情况为真,则此代码不安全。

4

4 回答 4

2

当 object 不为 null 时,会发生短路评估,并且object.someMethod()永远不会被调用。

当 object 为 null 时,此表达式应在object.someMethod()计算时抛出 NullPointerException。

这不是一个特别有用的条件。考虑是否打算用 && 代替 ||。

于 2013-05-15T13:05:54.727 回答
2

the||由 Java 定义为短路运算符。因此,如果第一个条件是true它不会评估第二个条件。这与|不是短路的运算符不同。在编写 Java 代码时,对短路运算符的依赖是非常普遍的做法。

也就是说,Marco's评论是完全正确的。您正在使用||运算符,您可能应该使用&&运算符。适用相同的短路规则。

于 2013-05-15T13:06:02.153 回答
0

它是 Java 标准行为。逻辑 OR ( ||) 是一个“短路”运算符,这意味着它只评估它需要的内容,以确定整个条件是否为真。如果要强制评估每个守卫,请使用|.

于 2013-05-15T13:05:51.130 回答
0

someMethod可以是一个静态方法,即使对象不存在也返回 true。编译器应该警告你。

于 2013-05-15T13:06:12.900 回答