Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 懒惰的评估没有正常工作_Java_Lazy Evaluation - Fatal编程技术网

Java 懒惰的评估没有正常工作

Java 懒惰的评估没有正常工作,java,lazy-evaluation,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都返回布

我必须频繁地计算布尔表达式,所以我在它的类中的私有方法中转换了它。这是给我带来麻烦的代码:

//"x", "y" and "team" are already defined
return (map.isWalkable(x,y) && 
    (!map.isOccupied(x,y) || map.getOccupant(x, y).getTeam() == team) );
就这个问题而言,方法应该是非常自解释的。现在,isWalkable和isOccupied都返回布尔值,而GetOccount是唯一返回对象引用的方法。问题是,在执行这段代码时,我得到了一个NullPointerException,而这不应该发生,因为isOccupied在且仅当map.getOccupant!=null(该方法实际返回的值)。因此,如果语言支持从左到右的惰性布尔求值(我假设java是这样的,或者至少我能读到这一点),那么getOccount方法永远不应该在返回null时执行,对吗


这比我想象的更依赖于编译器吗?如果我使用if语句会更安全,或者我这里缺少的只是一些明显的东西,那么操作可能会以另一种方式得到解决。

简单地说,不,延迟计算不会被破坏。你的代码是。
map
为空,或者
map.getOccount(x,y)
返回空

如果你把它们放在自己的行上,用调试器检查它们,你会注意到“哦,不,我太傻了,没有注意到”


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

问题在于括号。试一试

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

我认为在getTeam()之后有一个右括号太多了。这很容易自己调试,为什么要在这里问?将每个子结果分配给它自己的变量,并打印它们/测试它们的
null
。这是一个3分钟的工作,如果你很慢的话。我很确定这不是原始代码(因为你的右括号有解析问题),那么我们怎么知道你没有犯其他错误呢?你的右括号好像放错了。它能编译吗?废话。看来我对你的说法感到困惑。真正的问题是不平衡的括号。感谢您指出这一点,我编辑了问题以解决它,但它不是导致异常的原因。NullPointerException只会在以下两种情况下引发:要么
map
为null,当您尝试在
null
对象上执行一个方法时,或者当
map的返回时,会引发异常。GetOccount(x,y)
为null,并且会引发异常,因为您试图在
null
对象上调用
getTeam()
。是的,问题已经得到了回答,但是我不能把它标记为回答得那么快,所以不让我这么做。不过还是谢谢你。编辑:看来不是。有人抹掉了我要接受的答案。。。