Don*_*nie 17 java short-circuiting logical-operators
我认为Java有短路评估,但这一行仍然抛出一个空指针异常:
if( (perfectAgent != null) && (perfectAgent.getAddress().equals(entry.getKey())) ) {
Run Code Online (Sandbox Code Playgroud)
在这种情况下perfectAgent是null,所以我只是希望整个表达式返回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错误 - 但我非常怀疑它.
Java 确实有短路评估.也许entry是null因为entry.getKey()这导致了NullPointerException.另一种可能性是getAddress()返回null或NullPointerException在某处发生(如果它比简单的return语句更复杂).
编辑:我看到你的编辑,你声称这个:
更重要的是,它不可能执行
perfectAgent.getAddress()......
但是,如果perfectAgent.getAddress() 被成功执行和回报 null?明白了吗...
高级调试课程#1:
如果遇到看似不可能出现的错误(例如与Java相关的错误),请执行以下操作:
查阅信誉良好的教科书(或者更好的是相关标准),以确认您的理解没有缺陷.(在这种情况下,你的理解是正确的,任何半正式的教科书都会在一分钟内证实这一点.)
检查你可能做的所有可能导致不可能的错误的愚蠢事情.诸如不保存文件,不进行完整构建,运行应用程序的旧/陈旧版本,位于错误目录等等.
总之,要学会怀疑自己多一点.
| 归档时间: |
|
| 查看次数: |
9984 次 |
| 最近记录: |