2014-03-31 153 views
1

我讀jls §5.1.7和它說,有9種拳術,第九一個是拳擊From the null type to the null type允許裝箱的空值,那麼爲什麼拆箱不被允許?

然後我讀到的nullUnboxing Conversion拋出一個NullPointerException。好的,這很明顯。 隨後的null拳擊爲什麼不拋出一個NullPointerException,什麼是使用拳null價值?

+1

你怎麼能有一個原始的null? –

+0

我認爲它不是原始的null,我們可以將null類型的boxing設置爲null類型,就像jls所說的那樣。我的問題是什麼是使用拳擊null,爲什麼它不會拋出NPE。 – Vishrant

+0

答案是你給'這條規則是必要的,因爲條件運算符(§15.25)適用裝箱轉換的各類操作數的鏈接,並使用該結果進一步calculations.' –

回答

1

轉換null爲整數不會拋出NullPointerException因爲null爲任何引用一個有效的值,例如: Integer intObject = null; // fine

但是,你不能做到這一點:

int intPrimitive = intObject; // not fine

因爲當你嘗試將Integer轉換爲intInteger.intValue()在幕後調用,但調用任何方法空引用拋出NPE:

Object whatever = null; 
whatever.anyMethod(); // always throws NPE 

由於參考點null,所選擇的類型的不是一個實際的對象。

+0

沒有答案。我的問題是「拳擊」和「拆箱」不引用類型可以有'空值'和原始不能,我知道這也有一個答案http://stackoverflow.com/questions/19511616/why-java-does-未允許無效而-宣佈,原始數據類型 – Vishrant

0

我想您所提供的文檔給出答案。 「這條規則是必要的,因爲條件運算符對其操作數的類型應用了裝箱轉換,並將結果用於進一步的計算。」

如果的?:秒和第三個操作數之一不是布爾或數值表達式,那麼可以使用拳。例如,true?1:2類型是int,而true?null:1類型是Integer。在第二個例子中,使用了自動裝箱。並且在運行時,第二個示例的類型將爲null類型,因爲在裝箱時將獲得null類型。