我不得不频繁地评估一个布尔表达式,所以我在它的类中将它转换为一个私有方法。这是给我带来麻烦的代码:
//"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,这不应该发生,因为 isOccupied 当且仅当 map.getOccupant != null 时才返回 true (这实际上是该方法返回的内容)。因此,使用一种支持从左到右的惰性布尔求值的语言(我假设 java 是,或者至少这是我能够阅读的内容),只要 getOccupant 方法返回 null 就永远不应该执行,对吗?
这比我想象的更依赖编译器吗?如果我使用 if 语句是否更安全,或者我在这里遗漏了什么明显的东西,也许操作会反过来解决。