Java短路评估

Don*_*nie 17 java short-circuiting logical-operators

我认为Java有短路评估,但这一行仍然抛出一个空指针异常:

if( (perfectAgent != null) && (perfectAgent.getAddress().equals(entry.getKey())) ) {
Run Code Online (Sandbox Code Playgroud)

在这种情况下perfectAgentnull,所以我只是希望整个表达式返回false,但我的应用程序与一个NullPointerException这条线仍然会崩溃.

编辑,一般回复:

由于perfectAgentIS null,没什么的权&&应该被执行,因为这是不可能的表达是真实的.更重要的是,它不可能执行,perfectAgent.getAddress()因为perfectAgent它不包含有效的引用(它是null和all).我正在尝试使用短路评估,而不必在单独的语句中检查null,因为这会使逻辑变得更加草率.

编辑2(或者,我是一个白痴):是的,就像生活中的许多事情一样,在向世人宣布你是个白痴之后,你就找到了答案.在这种情况下,我在执行其他操作时关闭了Eclipse的autobuild而没有将其重新打开,因此我调试了与我的源不匹配的类文件.

Jon*_*eet 10

如果perfectAgent真的为null,那么该代码不会抛出异常(至少假设没有奇怪的线程进行,将其从非null变为null到表达式的一半).如果你能够制作一个简短但完整的程序来证明它这样做,我会感到非常震惊.

所以是的,你的直觉是正确的 - 这应该不是问题.寻找其他原因.我强烈怀疑,perfectAgent 是不是真正为空,而你正在运行到任何的代码的其他情况下可能导致异常.

我建议你尝试将这些代码提取到一个简短但完整的例子中 - 如果你能这样做,我会吃掉我的隐喻帽子; 如果没有,你会在尝试提取时发现问题.

是什么让你认为perfectAgent真的空的?尝试在它之前插入此代码:

if (perfectAgent == null)
{
    System.out.println("Yup, it's null");
}
Run Code Online (Sandbox Code Playgroud)

另一个非常非常微小的可能性是你遇到了一个JIT错误 - 但我非常怀疑它.

  • 乔恩,我是个白痴,对不起!当我读/写这个时,我的孩子们正在回到学校.我会逆转. (2认同)

Asa*_*aph 7

Java 确实有短路评估.也许entrynull因为entry.getKey()这导致了NullPointerException.另一种可能性是getAddress()返回nullNullPointerException在某处发生(如果它比简单的return语句更复杂).

编辑:我看到你的编辑,你声称这个:

更重要的是,它不可能执行perfectAgent.getAddress()......

但是,如果perfectAgent.getAddress() 成功执行和回报 null?明白了吗...


Ste*_*n C 6

高级调试课程#1:

如果遇到看似不可能出现的错误(例如与Java相关的错误),请执行以下操作:

  • 查阅信誉良好的教科书(或者更好的是相关标准),以确认您的理解没有缺陷.(在这种情况下,你的理解是正确的,任何半正式的教科书都会在一分钟内证实这一点.)

  • 检查你可能做的所有可能导致不可能的错误的愚蠢事情.诸如不保存文件,不进行完整构建,运行应用程序的旧/陈旧版本,位于错误目录等等.

总之,要学会怀疑自己多一点.