这些比较是否始终可以安全地创建NullPointer异常?
if( myObject == null || myObject.someMethod() == someValue )
{
if( myObject == null && myObject.getAlwaysTrue() )
{
}
}
除了短路之外,java中的条件评估是否有一些方向优先?
更新:我知道myObject.anything()
会抛出一个NullPointer。它只是我遇到了其他程序员的代码,我想知道是否有一种安全的方法可以在单一条件下压缩多次检查和空检查。我正在寻找一条坚持的好规则。
答案 0 :(得分:6)
不,这条线不安全:
if( myObject == null && myObject.getAlwaysTrue() )
如果您知道myObject
为空,那么您不应该尝试取消引用它。如果你写了这个:
if( myObject != null && myObject.getAlwaysTrue() )
那么这将是安全的。这是因为&&
(和||
就此而言)有short-circuit evaluation。如果您编写a && b
并且表达式a
的计算结果为false,则表达式b
不会被评估,因此它不会抛出异常。始终首先评估左操作数。
答案 1 :(得分:3)
为什么不分开门控问题?
if (myObject != null) {
if ((myObject.someMethod() == someValue) && myObject.getAlwaysTrue()) {
}
}
答案 2 :(得分:2)
if( myObject == null && myObject.getAlwaysTrue() )
当NullPointerException
为myObject
null
答案 3 :(得分:1)
如果myObject
为null
,则第二个myObject.getAlwaysTrue()
语句中的if
将始终生成NullPointerException
。
在||
的情况下,if
表达式计算布尔表达式,直到找到第一个true
。
使用&&
if
表达式计算布尔表达式,直到找到第一个false
。
因此,在myObject
为null
的情况下,您将获得以下评估:
首先if
:
myObject == null -> true
第二个if
:
myObject == null -> true
myObject.getAlwaysTrue() -> NullPointerException
答案 4 :(得分:1)
无论我能在哪里,我都会努力减少压痕和复杂的“ifology”。在你的情况下,我只是写
if (myObject == null) return;
... go on knowing that myObject is not null...
答案 5 :(得分:0)
这不是:
if( myObject == null && myObject.getAlwaysTrue() )
&&
将检查两个条件,如果myObject为null,myObject.getAlwaysTrue()
将抛出NullPointerException。