簡體   English   中英

拆箱如何在短路布爾表達式中工作?

[英]How does unboxing work in short-circuited boolean expressions?

我最近嘗試運行以下兩段代碼,並對輸出感到驚訝。

第一:

// ...
System.out.println( (Boolean)null || true );
// ...

第二:

// ...
System.out.println( (Boolean)null || false );
// ...

第一個示例導致以下輸出:
真正

第二個示例導致以下輸出:
線程“main”java.lang.NullPointerException中的異常
在com.blah.main(SanityCheck.java:26)

我原以為這兩個例子都會導致空指針異常,因為任何短路都是從左到右應用的。 從布爾值中取消裝箱布爾值的嘗試應該在邏輯的另一側或考慮之前失敗。

誰能解釋這種不一致的行為?

我通過JAD運行類文件,看看優化代碼的樣子。 對於真實案例:

// ...
System.out.println(true);
// ...

對於虛假案件:

// ...
System.out.println(null.booleanValue());
// ...

我會抨擊它。 當編譯器試圖解釋這兩個語句時,主要區別在於右側的true語句不需要用左手布爾值進行計算,而右側的語句是false。

布爾值是一個Object,因此可以設置為null。 這不是引發異常的地方。 當您嘗試對設置為null的Boolean對象執行操作時,將引發NullPointerException。 在真實情況下,編譯器會將cast null傳遞給布爾值,並且因為OR與true將始終產生true,條件為true。 在false的情況下,編譯器會再次將cast null傳遞給Boolean,然后檢查false,如果條件為false,則需要使用Boolean計算OR,因為條件最終可能為true或false。 計算發生時,拋出NullPointerException。

我無法重現你的結果。 我實際上得到兩個案件的NPE。

根據JLS,始終首先評估左側操作數表達式。 當計算(Boolean)null ,將對null Boolean對象執行自動取消裝箱。 特別是,底層代碼null.booleanValue()正在導致NPE。

暫無
暫無

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

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