懒惰的评估不能正常工作

时间:2013-08-07 13:06:08

标签: java lazy-evaluation

我必须频繁地评估一个布尔表达式,所以我在它的类中用私有方法转换它。这是导致我麻烦的代码:

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

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

这是否比我想象的更依赖于编译器?如果我使用if语句会更安全吗,或者只是我在这里缺少一些明显的东西,也许操作会被反过来解决。

2 个答案:

答案 0 :(得分:1)

简单地说,不,懒惰的评价没有被打破。你的代码是。 map为空,或map.getOccupant(x,y)返回null。

如果你把它们放在自己的线上并用调试器来完成它们,你会注意到“哦,不,我是如此愚蠢,并没有注意到”。

编译器,JVM或其他任何东西都与此无关。

答案 1 :(得分:1)

问题是你的括号。尝试

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