Java - 这个方法调用会被评估吗?
Java - would this method call ever be evaluated?
我的 IDE 将以下代码片段的第二次函数调用标记为 NullPointerException 的潜在来源,我不确定是否确实如此。
片段:
Sprite tmp = coordinateUtils.getSpriteUnderEntity(p);
if( isOutOfBounds(p)
||(p.collides(tmp)&&Resource.isImpenetrable(tmp.getType()))
){
//do stuff
}
(为澄清起见,coordinateUtils.getSpriteUnderEntity()
将 Sprite
作为其坐标的参数,然后 return 当前位于其下方的(背景)Sprite
,或 null
如果 Sprite
下面什么都没有)
p
是一种射弹,是一种 Sprite
,它有一个 collides
方法,而 tmp
是一个 Sprite。这是该方法的简化版本(简化为实际碰撞逻辑将被隐藏,因为它与此问题无关)。
public boolean collides(Sprite other){
return other != null && doesItCollide(other);
}
other
(代码段中的 tmp
)实际上可以为 null,但由于 collides
在 getType()
之前被调用,如果 return 为 false other
(tmp
) 是 null
我永远不能 运行 变成 NullPointerException
对吧?
换句话说,java的评价在这里很懒,对吧?
public boolean collides(Sprite other){
return other != null && doesItCollide(other);
}
不,不会对其进行评估。 Java &&
运算符“short-circuits”,这意味着它首先计算左边的表达式,只有当它是 true
时,才计算右边的表达式。 IDE 可能“不够聪明”,无法解决此类情况。
不同的是方法可以被标记为抛出NPE。在这种情况下,你必须(或者你应该)处理它,因为它不一定是由参数引起的,而是由方法内部的某些东西引起的。
另见 this answer。
我的 IDE 将以下代码片段的第二次函数调用标记为 NullPointerException 的潜在来源,我不确定是否确实如此。
片段:
Sprite tmp = coordinateUtils.getSpriteUnderEntity(p);
if( isOutOfBounds(p)
||(p.collides(tmp)&&Resource.isImpenetrable(tmp.getType()))
){
//do stuff
}
(为澄清起见,coordinateUtils.getSpriteUnderEntity()
将 Sprite
作为其坐标的参数,然后 return 当前位于其下方的(背景)Sprite
,或 null
如果 Sprite
下面什么都没有)
p
是一种射弹,是一种 Sprite
,它有一个 collides
方法,而 tmp
是一个 Sprite。这是该方法的简化版本(简化为实际碰撞逻辑将被隐藏,因为它与此问题无关)。
public boolean collides(Sprite other){
return other != null && doesItCollide(other);
}
other
(代码段中的 tmp
)实际上可以为 null,但由于 collides
在 getType()
之前被调用,如果 return 为 false other
(tmp
) 是 null
我永远不能 运行 变成 NullPointerException
对吧?
换句话说,java的评价在这里很懒,对吧?
public boolean collides(Sprite other){
return other != null && doesItCollide(other);
}
不,不会对其进行评估。 Java &&
运算符“short-circuits”,这意味着它首先计算左边的表达式,只有当它是 true
时,才计算右边的表达式。 IDE 可能“不够聪明”,无法解决此类情况。
不同的是方法可以被标记为抛出NPE。在这种情况下,你必须(或者你应该)处理它,因为它不一定是由参数引起的,而是由方法内部的某些东西引起的。
另见 this answer。