Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.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_Logical Operators_Short Circuiting - Fatal编程技术网

Java短路评估

Java短路评估,java,logical-operators,short-circuiting,Java,Logical Operators,Short Circuiting,我以为Java有短路评估,但这一行仍然抛出空指针异常: if( (perfectAgent != null) && (perfectAgent.getAddress().equals(entry.getKey())) ) { 在本例中,perfectAgent为null,因此我只希望整个表达式返回false,但我的应用程序仍在这一行出现NullPointerException崩溃 编辑,一般答复: 由于perfectAgent为null,因此不应执行&右侧的任何内容,因为表达式

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

if( (perfectAgent != null) && (perfectAgent.getAddress().equals(entry.getKey())) ) {
在本例中,
perfectAgent
null
,因此我只希望整个表达式返回
false
,但我的应用程序仍在这一行出现NullPointerException崩溃

编辑,一般答复:

由于
perfectAgent
null
,因此不应执行
&
右侧的任何内容,因为表达式不可能为真。更重要的是,不可能执行
perfectAgent.getAddress()
,因为
perfectAgent
不包含有效的引用(它是null和all)。我试图使用短路求值,不必在单独的语句中检查null,因为这会使逻辑更加松散

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

您确保
perfectAgent
不为空,因此一个或多个
perfectAgent.getAddress()
entry
entry.getKey()
必须为空。或getAddress()或getKey()在其实现中遇到NPE

要调试这类事情,请首先查看堆栈跟踪以确定位置。这将告诉您它是发生在getAddress()中还是发生在getKey()中,还是发生在调用它们的粘贴代码段中。接下来,如果它在这个代码段中,请在if-to-test之前添加一些代码,该代码为null。您可以使用良好的旧System.err.println()或。(如果使用断言,请确保使用java命令的-enableassertions标志启用它们。)

更新:所以我的解释是错误的。。。这个问题提出了两个相互矛盾的事实(这一行上有一个NPE,但短路应该发生),我自动地假设第一个事实是正确的,第二个是错误的,而事实上这是一个完全不同的问题,因为在Eclipse中关闭了自动构建。哼!在调试“不可能”的东西时,从根本上持怀疑态度是有帮助的。

Java确实有短路评估。也许
entry
null
,因此
entry.getKey()
导致了
NullPointerException
。另一种可能是
getAddress()
返回
null
或在某个地方发生
NullPointerException
(如果它比简单的
return
语句更复杂的话)

编辑:我看到您的编辑,您声称:

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


但是如果
perfectAgent.getAddress()
成功执行并返回
null
,该怎么办?明白我的意思了吧…

除了perfectAgent之外,还有三个引用可以为空:

  • perfectAgent.getAddress()
  • 入口
  • entry.getKey()

分解语句或在调试器中运行它。

如果
perfectAgent
真的为null,则该代码不会引发异常(至少假设没有发生奇怪的线程问题,在表达式的中途将其从非null更改为null)。如果你能制作一个简短但完整的程序来演示它的做法,我会非常震惊

所以,是的,你的直觉是正确的——这不应该是个问题。寻找其他原因。我强烈怀疑
perfectAgent
实际上不是空的,并且您在该代码中遇到了可能导致异常的任何其他情况

我建议您尝试将这些代码提取到一个简短但完整的示例中——如果您可以这样做,我将不戴我的隐喻帽子;如果没有,您将有望在尝试提取时发现问题

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

if (perfectAgent == null)
{
    System.out.println("Yup, it's null");
}

另一个非常非常微小的可能性是您遇到了JIT错误,但我对此深表怀疑

大迷雾。我复制了您的代码行,并使用
perfectAgent==null
entry==null
entry.getKey()==null
以及这些组合进行了测试:我的测试台上没有NPE(Java 1.6)


无论它是什么恼人的错误,我怀疑它与短路评估有关。如果这条线导致了NPE,那么,据我所知,perfectAgent不是空的。祝你好运,一旦你发现了错误,就告诉我们:)

试着像这样格式化你的代码:

if( 
  (perfectAgent != null) 
  && (
      perfectAgent.getAddress()
      .equals(
       entry.getKey()
      )
     ) 
  ) {

它应该为您提供更好的堆栈跟踪行条目。

高级调试课程#1:

如果您遇到看似不可能的错误(例如,与您对Java的了解相矛盾的错误),请执行以下操作:

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

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


总之,要学会更多地怀疑自己。

您检查过条目是否不为null吗?perfectAgent.getAddress()是否可能返回null?您确定getAddress()没有返回null吗?您没有根据新的源代码(行号不同)调试旧jar中的代码,是吗?我最近被这句话咬了一口…+1,因为我公开说出了问题所在,尽管这有点尴尬。
entry.getKey()
为空