首頁  >  文章  >  Java  >  為什麼三元運算子允許 int 傳回 Null,而 if 語句不允許?

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

Susan Sarandon
Susan Sarandon原創
2024-11-05 01:09:01274瀏覽

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

三元運算子與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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn