三元運算子與if 語句傳回null int
在Java 中,三元運算子(?:) 允許賦值null 到int 類型的變量,即使int 是不支援null 值的原始資料型別。考慮以下程式碼片段:
int temp() {
return true ? null : 0;
}
在此程式碼中,如果計算條件為 true,則三元運算子將 null 指派給變數 temp,否則指派 0。編譯器允許此分配而不會發出任何錯誤。然而,當該方法執行時,它會在運行時拋出 NullPointerException,因為 null 不是 int 的有效值。
與三元運算子相反,if 語句不允許對下列變數進行此類 null 賦值原始類型。例如:
int same() {
if (true) {
return null;
} else {
return 0;
}
}
此程式碼將產生編譯時錯誤,並顯示訊息「不相容的類型:null 無法轉換為 int」。造成這種差異的原因在於編譯器處理 null 值的方式。
在三元運算子的情況下,編譯器將 null 文字解釋為 Integer(int 的包裝類別)的 null 參考。這是由於自動裝箱和拆箱的編譯器規則所致:當從基本型別轉換為物件類型時,Java 虛擬機器 (JVM) 會自動將基本值包裝在對應的物件包裝器中。
由於 int 是一個原始類型,編譯器會嘗試將三元運算子傳回的 null 值拆箱,這會導致 NullPointerException。
另一方面,if 語句不會執行此拆箱過程,並且 null 文字仍然存在作為物件的空引用。由於same()方法的回傳類型是int,編譯器無法將空參考轉換為int,因此會出現編譯時錯誤。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3