2016-12-26 79 views

回答

3

行爲你確定三元條件表達式類型的規則遇到的結果。

在你的情況中,表達

val == null ? val : val.intValue(); 

int的類型。

這是通過JLS 15.25.指定:

類型的條件表達式的確定如下:

  • 如果第二和第三個操作數具有相同的類型(其可以是零類型),那麼這就是條件表達式的類型。

  • 如果第二個和第三個操作數中的一個是原始類型T,而另一個的類型是對T應用裝箱轉換(第5.1.7節)的結果,則條件表達式的類型是T

你的第二個操作數Integer和第三個操作數爲int,因此表達的類型是int

因此,當val == null時,val被取消裝箱(即val.intValue()被調用爲空值)並且NullPointerException被拋出。

在你的if-else表達式val不是未裝箱時其值爲null(因爲你把它分配給一個Object變量,所以沒有NullPointerException

這就是說,因爲你是分配一個整型變量給對象變量,您無論是在片段的條件是沒有意義的(因爲分配的intObject變量簡單的框intInteger)。

你可以簡單地分配

Object res = val; 

並得到相同的最終結果沒有例外。

+0

感謝您的快速反應伊蘭。我試圖在第三個參數中分配Integer對象,它在不拋出空指針異常的情況下賦值爲null。 整數y = null; Object res = val == null? val:y; –