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,但由于 collidesgetType() 之前被调用,如果 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