Java 检查逻辑析取中的所有条件

Java 检查逻辑析取中的所有条件,java,standards,Java,Standards,我在这行代码中找到了问题。忽略以下事实,即此代码没有意义: if (object != null || object.someMethod()) object.doSomething(); 首先,我认为如果对象为null,那么该代码将抛出NullPointerException。但是,这是一个逻辑析取,如果其中一个条件为真,则整个条件为真。因此编译器不会检查第二个条件,也不会抛出NullPointerException 这是Java标准行为还是特定于实现?如果第二种情况为真,则此代码不安全。这

我在这行代码中找到了问题。忽略以下事实,即此代码没有意义:

if (object != null || object.someMethod()) object.doSomething();
首先,我认为如果对象为null,那么该代码将抛出
NullPointerException
。但是,这是一个逻辑析取,如果其中一个条件为真,则整个条件为真。因此编译器不会检查第二个条件,也不会抛出
NullPointerException


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

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

这是Java标准行为。逻辑OR(
|
)是一个“短路”运算符,意味着它只计算所需的内容,以确定整个条件是否为真。如果要强制计算每个防护,请在对象不为null时使用
|

进行短路计算,并且从不调用
对象。someMethod()

当object为null时,当计算
object.someMethod()
时,此表达式应引发NullPointerException


这不是一个特别有用的条件。考虑是否是“和”,而不是{。< /P> < P>当对象不是空时,发生短路评估,而<代码>对象。 当object为null时,当计算
object.someMethod()
时,此表达式应引发NullPointerException


这不是一个特别有用的条件。请考虑java是否定义为< & > p> > p> >代码> > <代码>是Java定义的一个短路操作。因此,如果第一个条件为
true
,则不计算第二个条件。这与非短路的
|
运算符不同。在编写Java代码时,对短路运算符的依赖是非常常见的做法


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

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


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

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

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

如果对象为
null
,给定代码将抛出
NullPointerException
:应该是
&&
,以防止给定代码在对象为
null
时抛出
NullPointerException
:应该是
&
,以防止出现这种情况