3

这些比较是否总是可以避免创建 NullPointer Exception ?

if( myObject == null || myObject.someMethod() == someValue )
{
    if( myObject == null && myObject.getAlwaysTrue() )
       {

       }
}

除了短路之外,Java 中是否有一些条件评估的方向优先级?

更新:我知道myObject.anything()会抛出一个 NullPointer。只是我遇到了其他程序员这样的代码,我想知道是否有一种安全的方法可以在单个条件下压缩多个检查以及空检查。我正在寻找一个可以坚持的好规则。

4

6 回答 6

6

不,这条线不安全:

if( myObject == null && myObject.getAlwaysTrue() )

如果你知道那myObject是 null 那么你不应该尝试取消引用它。但是,如果您这样写:

if( myObject != null && myObject.getAlwaysTrue() )

那么就安全了。这是因为&&(并且||就此而言)具有短路评估。如果您编写a && b并且表达式的a计算结果为 false,则表达式b不会被计算,因此它不会引发异常。总是首先计算左操作数。

于 2012-08-23T21:03:11.427 回答
3

为什么不把门控问题分开呢?

if (myObject != null) {
    if ((myObject.someMethod() == someValue) && myObject.getAlwaysTrue()) {

    }
}
于 2012-08-23T21:06:09.680 回答
2
if( myObject == null && myObject.getAlwaysTrue() )

NullPointerException这会导致myObjectnull

于 2012-08-23T21:03:26.493 回答
1

如果myObjectnull,则myObject.getAlwaysTrue()在第二if条语句中将始终导致NullPointerException.

在表达式的情况下,||计算if布尔表达式,直到找到第一个true.

使用表达式计算布尔表达式&&if直到找到第一个false.

因此,在您的情况下 when myObjectis null,您将获得以下评估:

首先if

myObject == null -> true

第二if

myObject == null -> true
myObject.getAlwaysTrue() -> NullPointerException
于 2012-08-23T21:07:11.700 回答
1

尽我所能,我努力减少缩进和复杂的“ifology”。在你的情况下,我会写

if (myObject == null) return;
... go on knowing that myObject is not null...
于 2012-08-23T21:18:54.973 回答
0

这不是 :

if( myObject == null && myObject.getAlwaysTrue() )

&&将检查这两个条件,myObject.getAlwaysTrue()如果 myObject 为空,将抛出 NullPointerException。

于 2012-08-23T21:02:37.603 回答