三元運算子與if 語句傳回int
在Java 中,三元運算子(?:) 允許賦值null 到int類型的變量,即使int 是不支援null 值的原始資料類型。考慮以下程式碼片段:
<code class="java">int temp() { return true ? null : 0; }</code>
在此程式碼中,如果計算條件為 true,則三元運算子將 null 指派給變數 temp,否則指派 0。編譯器允許此分配而不會發出任何錯誤。然而,當該方法執行時,它會在運行時拋出 NullPointerException,因為 null 不是 int 的有效值。
與三元運算子相反,if 語句不允許對下列變數進行此類 null 賦值原始類型。例如:
<code class="java">int same() { if (true) { return null; } else { return 0; } }</code>
此程式碼將產生編譯時錯誤,並顯示訊息「不相容的類型:null 無法轉換為 int」。造成這種差異的原因在於編譯器處理 null 值的方式。
在三元運算子的情況下,編譯器將 null 文字解釋為對 Integer(int 的包裝類別)的 null 引用。這是由於自動裝箱和拆箱的編譯器規則所致:當從原始類型轉換為物件類型時,Java 虛擬機器 (JVM) 會自動將原始值包裝在對應的物件包裝器中。
因為 int 是一個原始類型,編譯器會嘗試將三元運算子傳回的 null 值拆箱,這會導致 NullPointerException。
另一方面,if 語句不會執行此拆箱過程,並且 null 文字仍然存在作為物件的空引用。由於 Same() 方法的傳回型別是 int,編譯器無法將 null 參考轉換為 int,因此會出現編譯時錯誤。
以上是為什麼三元運算子允許 int 傳回 Null,而 if 語句不允許?的詳細內容。更多資訊請關注PHP中文網其他相關文章!