2013-08-07 99 views
0

我必须非常谨慎地评估一个布尔表达式,所以我将它转换为它的类中的私有方法。下面是它的代码是造成我的麻烦:懒惰的评估不正常,因为它应该

//"x", "y" and "team" are already defined 
return (map.isWalkable(x,y) && 
    (!map.isOccupied(x,y) || map.getOccupant(x, y).getTeam() == team)); 

方法应该是preety不言自明,作为这个问题的目的。现在,isWalkable和isOccupied都返回一个布尔值,而getOc​​cupant是返回对象引用的唯一方法。问题是执行这段代码时我得到一个NullPointerException,并且不应该发生,因为isOccupied返回true当且仅当map.getOc​​cupant!= null(实际上该方法返回)。所以使用支持从左到右的懒布尔值评估的语言(因为我认为java是,或者至少这是我能够读的),getOc​​cupant方法永远不会执行,只要它会返回null我是吧?

这是更多的编译器依赖比我认为它是?如果我使用if语句更安全,还是有一些显而易见的错误,那么操作可能会相反。

+1

我觉得你在getTeam()后有太多的右括号。 –

+2

这很容易调试自己,为什么问这里?将每个subresult分配给它自己的变量并打印出来/测试它们为null。如果你很慢,这是一个3分钟的工作。 –

+1

我很确定这不是原始代码(因为它与你的右括号有分析问题),所以我们怎么知道你确实没有犯另一个错误? –

回答

1

问题是你的括号。尝试

return (map.isWalkable(x,y) && (!map.isOccupied(x,y) || map.getOccupant(x, y).getTeam() == team)); 
+0

谢谢你指出,我编辑了问题来解决它,但它不是什么导致异常。 – Setzer22

+0

NullPointerException只会在以下两种情况下引发:map'为null,当您尝试在'null'对象上执行方法或返回'map.getOc​​cupant(x ,y)'为null,并且因为您试图在'null'对象上调用'getTeam()'而抛出异常。 – Deactivator2

+0

是的,这个问题已经得到解答,但是我不能让它回答得那么快,因为SO不让我。不过谢谢你。 编辑:好像它没有。有人抹去我要接受的答案... – Setzer22

1

简而言之,不,懒惰的评价不会被打破。你的代码是。 map为空,或者map.getOccupant(x,y)返回null。

如果你把它们放在他们自己的路线上并用调试器通过它们,你会注意到“哦,不,我太笨了,没注意到”。编译器,JVM或其他与此无关的东西。