Long n = null;
for (Long price : new Long[]{null, 2L, 10L}) {
n = (n != null) ? 0L : price;
}
我很難過,爲什麼我在執行此代碼時得到一個NPE? 似乎只是一個簡單的賦值n =價格,其中價格爲空。 不要擔心它的意思,它沒有任何意義。爲什麼我在這裏得到一個NullPointerException?
Long n = null;
for (Long price : new Long[]{null, 2L, 10L}) {
n = (n != null) ? 0L : price;
}
我很難過,爲什麼我在執行此代碼時得到一個NPE? 似乎只是一個簡單的賦值n =價格,其中價格爲空。 不要擔心它的意思,它沒有任何意義。爲什麼我在這裏得到一個NullPointerException?
在行n = (n != null) ? 0L : price;
,你有一個long
和Long
作爲替代你?:
聲明。 Java將解釋這種類型爲long
,並嘗試解開Long
而不是框long
。當price
爲空時,就像它在第一次迭代中一樣,這會生成一個NPE。
如果你看看字節碼做導致你NullPointerException
的Long.longValue
正在對每個項目執行的比較數組中發生這種情況時
49: invokevirtual #26; //Method java/lang/Long.longValue:()J
52: invokestatic #20; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
。問題在於與AutoBoxing結合的三元表達式模糊了真正發生的事情。
優秀的答案,謝謝! – bouncyrabbit
線
n = (n != null) ? 0L : price;
被編譯成
n = Long.valueOf(n == null ? price.longValue() : 0L);
聲明price.longValue()
拋出NullPointerException
時price
是null
。嘗試用new Long[] {1L, 2L, 3L}
替換該陣列,然後查看它的工作情況。
這是因爲價格正在拆箱以匹配三元運算符中的返回可能性0L
。
嘗試,而不是:
Long n = null;
for (Long price : new Long[]{null, 2L, 10L}) {
n = (n != null) ? new Long(0L) : price;
}
,一切都會順利進行。
它試圖將price
強制爲原始long
,以匹配0L
的類型。如果price
是null
,這將生成NPE。
這種表達的作品,因爲它避免了隱式類型轉換:
n = (n != null) ? new Long(0L) : price ;
但正如其他的評論說,看來你在這裏所做的並沒有多大意義呢。
此代碼完全沒有意義 –
哪條線是被拋出的NPE? – skaffman
這一行,n =(n!= null)? 0L:價格; – bouncyrabbit