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
:应该是&
,以防止出现这种情况