我发现,这行代码的问题。 忽略了一个事实,这个代码是没有意义的:
if (object != null || object.someMethod()) object.doSomething();
首先我在想,这个代码将引发NullPointerException
,如果对象为空。 但是,这是一个逻辑分离,如果条件之一为真,整个条件为真。 所以编译器不检查第二个条件,不会引发NullPointerException
。
这是Java标准的行为或执行特定的? 如果第二种情况是真实的比这个代码是不安全的。
当对象不为空,短路评价发生,并且object.someMethod()
不会被调用。
当对象为空,当该表达应该抛出NullPointerException object.someMethod()
进行评价。
这不是一个特别有用的条件。 考虑&&是否意,而不是||。
该||
由Java的定义为短路操作。 因此,如果第一个条件是true
不计算第二个条件。 这是从不同|
操作者这是不短路。 编写Java代码当短路运营商的依赖是非常普遍的做法。
这就是说, Marco's
评论是完全正确的。 您正在使用||
算哪里,你或许应该使用&&
运算符。 相同的短路规则。
它是Java标准的行为 。 逻辑或( ||
)是“短路”操作符意味着它只计算它所需要,以确定整个条件是否是真还是假。 如果要强制每个后卫使用的评价|
。
someMethod
可能是返回true,即使对象不存在的静态方法。 编译器应该警告你。