2011-07-19 43 views
2

我收到一個奇怪的空指針異常,我不明白爲什麼。我縮小它與這個簡單的測試代碼,拋出第二行的NPE:從內聯條件語句的空指針異常

Long test = null; 
Long result = true ? test : -1L; 

雖然這個代碼工作正常:

Long result = true ? null : -1L; 

這是很容易避免只是沒有使用內聯條件語句,但任何人都可以向我解釋爲什麼會發生這種情況?

回答

5

我認爲這歸結於拆箱。下面的代碼將工作:

Long two = true ? test : new Long(-1); 

如果一個參數就是-1,那麼它會嘗試拆箱檢驗,因此把兩者視爲同一類型。取消裝箱空將導致空指針異常。如果在聲明中它是空的,它將足夠聰明,不會試圖解開它。

+0

這樣做,謝謝。這很糟糕。我不確定爲什麼Java覺得有必要強迫它們成爲同一類型。 –

+0

這就是三元運算符的工作方式,雙方都必須轉換爲相同的類型,以便它可以驗證兩者都能夠返回到您分配的對象。 –

2

它試圖取消參考test以獲得值long值,它不能這樣做。

0

在第一個例子中,它認爲右邊的表達式是long類型的(因爲右邊是常量)。它因此與自動裝箱試圖獲得測試的價值作爲一個長期,這拋出和NPE。

在第二個示例中,它將所有內容都視爲參考值;沒有自動裝箱和沒有崩潰。