0

我不得不频繁地评估一个布尔表达式,所以我在它的类中将它转换为一个私有方法。这是给我带来麻烦的代码:

//"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,这不应该发生,因为 isOccupied 当且仅当 map.getOc​​cupant != null 时才返回 true (这实际上是该方法返回的内容)。因此,使用一种支持从左到右的惰性布尔求值的语言(我假设 java 是,或者至少这是我能够阅读的内容),只要 getOc​​cupant 方法返回 null 就永远不应该执行,对吗?

这比我想象的更依赖编译器吗?如果我使用 if 语句是否更安全,或者我在这里遗漏了什么明显的东西,也许操作会反过来解决。

4

2 回答 2

1

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

如果您将它们放在自己的行上并使用调试器检查它们,您会注意到“哦,不,我太愚蠢了,没有注意到这一点”。

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

于 2013-08-07T13:10:11.683 回答
1

问题是你的括号。尝试

return (map.isWalkable(x,y) && (!map.isOccupied(x,y) || map.getOccupant(x, y).getTeam() == team));
于 2013-08-07T13:11:06.560 回答