检查逻辑分离中的所有条件

时间:2013-05-15 13:02:36

标签: java standards

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

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

首先,我认为如果object为null,此代码将抛出NullPointerException。但是,这是一个逻辑上的分离,如果其中一个条件是真的,那么整个条件都是正确的。因此,编译器不会检查第二个条件,也不会抛出NullPointerException

此Java标准行为或实现是否具体?如果第二种情况为真,则此代码不安全。

4 个答案:

答案 0 :(得分:2)

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

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

这不是一个特别有用的条件。考虑是否&&意图而不是||。

答案 1 :(得分:1)

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

尽管如此,Marco's评论是完全正确的。您正在使用||运算符,您应该使用&&运算符。适用相同的短路规则。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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