我收到一個奇怪的空指針異常,我不明白爲什麼。我縮小它與這個簡單的測試代碼,拋出第二行的NPE:從內聯條件語句的空指針異常
Long test = null;
Long result = true ? test : -1L;
雖然這個代碼工作正常:
Long result = true ? null : -1L;
這是很容易避免只是沒有使用內聯條件語句,但任何人都可以向我解釋爲什麼會發生這種情況?
我收到一個奇怪的空指針異常,我不明白爲什麼。我縮小它與這個簡單的測試代碼,拋出第二行的NPE:從內聯條件語句的空指針異常
Long test = null;
Long result = true ? test : -1L;
雖然這個代碼工作正常:
Long result = true ? null : -1L;
這是很容易避免只是沒有使用內聯條件語句,但任何人都可以向我解釋爲什麼會發生這種情況?
我認爲這歸結於拆箱。下面的代碼將工作:
Long two = true ? test : new Long(-1);
如果一個參數就是-1,那麼它會嘗試拆箱檢驗,因此把兩者視爲同一類型。取消裝箱空將導致空指針異常。如果在聲明中它是空的,它將足夠聰明,不會試圖解開它。
它試圖取消參考test
以獲得值long
值,它不能這樣做。
我認爲這是因爲Lang封裝了lang。所以,好歹,你的表情試圖得到一些財產,或從長對象長期價值..類似的東西...
這裏閱讀文檔:http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Long.html
希望它能幫助:)
在第一個例子中,它認爲右邊的表達式是long類型的(因爲右邊是常量)。它因此與自動裝箱試圖獲得測試的價值作爲一個長期,這拋出和NPE。
在第二個示例中,它將所有內容都視爲參考值;沒有自動裝箱和沒有崩潰。
這樣做,謝謝。這很糟糕。我不確定爲什麼Java覺得有必要強迫它們成爲同一類型。 –
這就是三元運算符的工作方式,雙方都必須轉換爲相同的類型,以便它可以驗證兩者都能夠返回到您分配的對象。 –