我在这行代码中找到了问题。忽略这段代码没有意义的事实:
if (object != null || object.someMethod()) object.doSomething();
首先,我认为如果object为null,此代码将抛出NullPointerException
。但是,这是一个逻辑上的分离,如果其中一个条件是真的,那么整个条件都是正确的。因此,编译器不会检查第二个条件,也不会抛出NullPointerException
。
此Java标准行为或实现是否具体?如果第二种情况为真,则此代码不安全。
答案 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。编译器应该警告你。