[英]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
; 請注意, null
是Integer
的有效值。 整個三元表達式的結果是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.