2011-08-26 85 views
4
Long n = null; 
for (Long price : new Long[]{null, 2L, 10L}) {   
n = (n != null) ? 0L : price; 
} 

我很難過,爲什麼我在執行此代碼時得到一個NPE? 似乎只是一個簡單的賦值n =價格,其中價格爲空。 不要擔心它的意思,它沒有任何意義。爲什麼我在這裏得到一個NullPointerException?

+3

此代碼完全沒有意義 –

+0

哪條線是被拋出的NPE? – skaffman

+0

這一行,n =(n!= null)? 0L:價格; – bouncyrabbit

回答

10

在行n = (n != null) ? 0L : price;,你有一個longLong作爲替代你?:聲明。 Java將解釋這種類型爲long,並嘗試解開Long而不是框long。當price爲空時,就像它在第一次迭代中一樣,這會生成一個NPE。

1

嘗試

n = (price != null) ? price : 0L; 
+0

是的。或者替換!= by == :-) – cadrian

+0

你已經改變了邏輯 - 你測試的價格不是'n'。當然,這可能是OP真正想要的,但它並沒有回答爲什麼NPE被拋出的問題。 –

+0

多數民衆贊成在正確的... – oliholz

2

如果你看看字節碼做導致你NullPointerExceptionLong.longValue正在對每個項目執行的比較數組中發生這種情況時

49: invokevirtual #26; //Method java/lang/Long.longValue:()J 
52: invokestatic #20; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long; 

。問題在於與AutoBoxing結合的三元表達式模糊了真正發生的事情。

+0

優秀的答案,謝謝! – bouncyrabbit

2

n = (n != null) ? 0L : price; 

被編譯成

n = Long.valueOf(n == null ? price.longValue() : 0L); 

聲明price.longValue()拋出NullPointerExceptionpricenull。嘗試用new Long[] {1L, 2L, 3L}替換該陣列,然後查看它的工作情況。

3

這是因爲價格正在拆箱以匹配三元運算符中的返回可能性0L

嘗試,而不是:

Long n = null; 
for (Long price : new Long[]{null, 2L, 10L}) {   
    n = (n != null) ? new Long(0L) : price; 
} 

,一切都會順利進行。

0

它試圖將price強制爲原始long,以匹配0L的類型。如果pricenull,這將生成NPE。

這種表達的作品,因爲它避免了隱式類型轉換:

n = (n != null) ? new Long(0L) : price ; 

但正如其他的評論說,看來你在這裏所做的並沒有多大意義呢。

相關問題