检查的逻辑和所有条件(Checking all conditions in a logical di

2019-10-18 03:45发布

我发现,这行代码的问题。 忽略了一个事实,这个代码是没有意义的:

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

首先我在想,这个代码将引发NullPointerException ,如果对象为空。 但是,这是一个逻辑分离,如果条件之一为真,整个条件为真。 所以编译器不检查第二个条件,不会引发NullPointerException

这是Java标准的行为或执行特定的? 如果第二种情况是真实的比这个代码是不安全的。

Answer 1:

当对象不为空,短路评价发生,并且object.someMethod()不会被调用。

当对象为空,当该表达应该抛出NullPointerException object.someMethod()进行评价。

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



Answer 2:

|| 由Java的定义为短路操作。 因此,如果第一个条件是true不计算第二个条件。 这是从不同| 操作者这是不短路。 编写Java代码当短路运营商的依赖是非常普遍的做法。

这就是说, Marco's评论是完全正确的。 您正在使用|| 算哪里,你或许应该使用&&运算符。 相同的短路规则。



Answer 3:

它是Java标准的行为 。 逻辑或( || )是“短路”操作符意味着它只计算它所需要,以确定整个条件是否是真还是假。 如果要强制每个后卫使用的评价|



Answer 4:

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



文章来源: Checking all conditions in a logical disjunction