簡體   English   中英

Java短路評估

[英]Java short circuit evaluation

我認為Java有短路評估,但這一行仍然拋出一個空指針異常:

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

在這種情況下, perfectAgentnull ,所以我只想讓整個表達式返回false ,但是我的應用程序仍在使用NullPointerException在此行上崩潰。

編輯,一般回復:

由於perfectAgentnull ,因此不應該執行&&右邊的任何內容,因為表達式不可能是真的。 更重要的是,不可能執行perfectAgent.getAddress()因為perfectAgent不包含有效引用(它是null和all)。 我正在嘗試使用短路評估,而不必在單獨的語句中檢查null,因為這會使邏輯變得更加草率。

編輯2(或者,我是一個白痴):是的,就像生活中的許多事情一樣,在向世人宣布你是個白痴之后,你就找到了答案。 在這種情況下,我在執行其他操作時關閉了Eclipse的autobuild而沒有將其重新打開,因此我調試了與我的源不匹配的類文件。

如果perfectAgent真的為null,那么該代碼不會拋出異常(至少假設沒有奇怪的線程事件發生,在表達式中將其從非null變為null)。 如果你能夠制作一個簡短但完整的程序來證明它這樣做,我會感到非常震驚。

所以是的,你的直覺是正確的 - 這應該不是問題。 尋找其他原因。 我強烈懷疑perfectAgent 實際上不是空的,你正在運行到任何的代碼的其他情況下可能導致異常。

我建議你嘗試將這些代碼提取到一個簡短但完整的例子中 - 如果你能這樣做,我會吃掉我的隱喻帽子; 如果沒有,你會在嘗試提取時發現問題。

是什么讓你認為perfectAgent真的空的? 嘗試在它之前插入此代碼:

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

另一個非常非常微小的可能性是你遇到了一個JIT錯誤 - 但我非常懷疑它。

Java 確實有短路評估。 也許entrynull ,因此entry.getKey()導致NullPointerException 另一種可能性是getAddress()要么返回null要么在某處發生NullPointerException (如果它比簡單的return語句更復雜)。

編輯:我看到你的編輯,你聲稱這個:

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

但是,如果perfectAgent.getAddress() 成功執行並返回 null 明白了嗎...

高級調試課程#1:

如果您遇到一個看似不可能的錯誤(例如,與您的Java知識相矛盾的錯誤),請執行以下操作:

  • 查閱信譽良好的教科書(或者更好的是相關標准),以確認您的理解沒有缺陷。 (在這種情況下,你的理解是正確的,任何半正式的教科書都會在一分鍾內證實這一點。)

  • 檢查你可能做的所有可能導致不可能的錯誤的愚蠢事情。 諸如不保存文件,不進行完整構建,運行應用程序的舊/陳舊版本,位於錯誤目錄等等。

總之,要學會懷疑自己多一點。

您確保perfectAgent不為null,因此perfectAgent.getAddress()entryentry.getKey()一個或多個必須為null。 或者getAddress()或getKey()在其實現中遇到NPE。

要調試此類事物,首先查看堆棧跟蹤以確定位置。 這將告訴您它是在getAddress()或getKey()中發生的,還是在調用它們的粘貼代碼片段中。 接下來,如果它在此片段中,則在if to test之前添加一些代碼,該代碼為null。 您可以使用舊的System.err.println()或斷言 (如果使用斷言,請確保使用java命令的-enableassertions標志啟用它們。)

更新:所以我的解釋證明是錯誤的...問題提出了兩個相互矛盾的事實(這條線上有一個NPE,但短路應該發生了)我自動認為第一個事實是真的,第二個是假的事實上,完全由於關閉了Eclipse中的自動構建,這是一個不同的問題。 咄! 在調試“不可能”的東西時,它會有助於從根本上持懷疑態度。

除perfectCgent之外,還有三個引用可以為null:

  • perfectAgent.getAddress()
  • 條目
  • entry.getKey()

分解語句或在調試器中運行它。

大謎。 我復制了你的代碼行,並使用perfectAgent == nullentry == nullentry.getKey() == null及其組合進行測試:在我的測試床中沒有NPE(Java 1.6)。

無論是什么煩人的錯誤,我懷疑它與短路評估有關。 如果是這條線導致NPE,那么,就我所知,perfectAgent不是空的。 祝你好運 - 一旦你抓住它就把它告訴我們:)

嘗試格式化代碼,如下所示:

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

它應該為您提供更好的堆棧跟蹤行條目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM