我必须频繁地评估一个布尔表达式,所以我在它的类中用私有方法转换它。这是导致我麻烦的代码:
//"x", "y" and "team" are already defined
return (map.isWalkable(x,y) &&
(!map.isOccupied(x,y) || map.getOccupant(x, y).getTeam() == team) );
就这个问题而言,方法应该是不言自明的。现在,isWalkable和isOccupied都返回一个布尔值,而getOccupant是返回对象引用的唯一方法。问题是我在执行这段代码时遇到了NullPointerException,并且不应该发生这种情况,因为当且仅当map.getOccupant!= null(实际上该方法返回的是)时,isOccupied返回true。所以用一种从左到右支持惰性布尔评估的语言(因为我假设java是,或者至少是我能够读到的),getOccupant方法永远不会被执行,只要它返回null我是对的吗?
这是否比我想象的更依赖于编译器?如果我使用if语句会更安全吗,或者只是我在这里缺少一些明显的东西,也许操作会被反过来解决。
答案 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));