[英]Java short circuit evaluation
我認為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
真的為null,那么該代碼不會拋出異常(至少假設沒有奇怪的線程事件發生,在表達式中將其從非null變為null)。 如果你能夠制作一個簡短但完整的程序來證明它這樣做,我會感到非常震驚。
所以是的,你的直覺是正確的 - 這應該不是問題。 尋找其他原因。 我強烈懷疑perfectAgent
實際上不是空的,你正在運行到任何的代碼的其他情況下可能導致異常。
我建議你嘗試將這些代碼提取到一個簡短但完整的例子中 - 如果你能這樣做,我會吃掉我的隱喻帽子; 如果沒有,你會在嘗試提取時發現問題。
是什么讓你認為perfectAgent
真的是空的? 嘗試在它之前插入此代碼:
if (perfectAgent == null)
{
System.out.println("Yup, it's null");
}
另一個非常非常微小的可能性是你遇到了一個JIT錯誤 - 但我非常懷疑它。
Java 確實有短路評估。 也許entry
是null
,因此entry.getKey()
導致NullPointerException
。 另一種可能性是getAddress()
要么返回null
要么在某處發生NullPointerException
(如果它比簡單的return
語句更復雜)。
編輯:我看到你的編輯,你聲稱這個:
更重要的是,不可能執行
perfectAgent.getAddress()
...
但是,如果perfectAgent.getAddress()
成功執行並返回 null
? 明白了嗎...
高級調試課程#1:
如果您遇到一個看似不可能的錯誤(例如,與您的Java知識相矛盾的錯誤),請執行以下操作:
查閱信譽良好的教科書(或者更好的是相關標准),以確認您的理解沒有缺陷。 (在這種情況下,你的理解是正確的,任何半正式的教科書都會在一分鍾內證實這一點。)
檢查你可能做的所有可能導致不可能的錯誤的愚蠢事情。 諸如不保存文件,不進行完整構建,運行應用程序的舊/陳舊版本,位於錯誤目錄等等。
總之,要學會懷疑自己多一點。
您確保perfectAgent
不為null,因此perfectAgent.getAddress()
或entry
或entry.getKey()
一個或多個必須為null。 或者getAddress()或getKey()在其實現中遇到NPE。
要調試此類事物,首先查看堆棧跟蹤以確定位置。 這將告訴您它是在getAddress()或getKey()中發生的,還是在調用它們的粘貼代碼片段中。 接下來,如果它在此片段中,則在if to test之前添加一些代碼,該代碼為null。 您可以使用舊的System.err.println()或斷言 。 (如果使用斷言,請確保使用java命令的-enableassertions標志啟用它們。)
更新:所以我的解釋證明是錯誤的...問題提出了兩個相互矛盾的事實(這條線上有一個NPE,但短路應該發生了)我自動認為第一個事實是真的,第二個是假的事實上,完全由於關閉了Eclipse中的自動構建,這是一個不同的問題。 咄! 在調試“不可能”的東西時,它會有助於從根本上持懷疑態度。
除perfectCgent之外,還有三個引用可以為null:
分解語句或在調試器中運行它。
大謎。 我復制了你的代碼行,並使用perfectAgent == null
, entry == null
, entry.getKey() == null
及其組合進行測試:在我的測試床中沒有NPE(Java 1.6)。
無論是什么煩人的錯誤,我懷疑它與短路評估有關。 如果是這條線導致NPE,那么,就我所知,perfectAgent不是空的。 祝你好運 - 一旦你抓住它就把它告訴我們:)
嘗試格式化代碼,如下所示:
if(
(perfectAgent != null)
&& (
perfectAgent.getAddress()
.equals(
entry.getKey()
)
)
) {
它應該為您提供更好的堆棧跟蹤行條目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.