簡體   English   中英

為什么我可以在三元操作中將原始類型設置為null

[英]why I can set primitive types to null in ternary operations

我一直認為Java中的原始類型不能為null ,因為如果我嘗試執行以下操作,這是一個編譯時錯誤:

int test = null;

但是在三元操作中,似乎允許:

int test = something != 0 ? 5 : null;

不是三元操作(在這種情況下):

int test;
if (something != 0){
    test = 5;
} else {
    test = null
}

這當然不應該被允許。 如果該條件失敗,由於自動裝箱,它將自動拋出NullPointerException 那么為什么java編譯器不會像這樣獲取廢話呢?

什么情況是,Java編譯器首先試圖使類型的表達式的兩側:平等。 在這種情況下,它將5自動裝箱到Integer ; 請注意, nullInteger的有效值。 整個三元表達式的結果是Integer 您將其分配給int ,因此然后自動裝箱Integer

本質上,編譯器應用autoboxing和-unboxing,以便該行看起來像這樣:

int test = (something != 0 ? Integer.valueOf(5) : null).intValue();

實際上,autounboxing null會導致NullPointerException

那么為什么java編譯器不會像這樣獲取廢話呢?

因為Java語言的設計者以這樣的方式定義了語言,所以它並沒有決定這必須被視為錯誤......

Java語言規范的第15.25節解釋了如何確定整個表達式的類型。

暫無
暫無

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

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