」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 為什麼三元運算子允許 int 傳回 Null,而 if 語句不允許?

為什麼三元運算子允許 int 傳回 Null,而 if 語句不允許?

發佈於2024-11-13
瀏覽:111

Why Does the Ternary Operator Allow Null Return for int While an if Statement Doesn't?

三元運算子與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