2012-02-07 71 views
2
Integer i = null; 
if (i == 3) 

爲什麼上面的第二線拋出一個NullPointerException,IMHO,這僅具有一個的含義,是包裝對象i是要取消裝箱其產生異常,例如:檢查空包裝器對基本值

ArrayList<Integer> list = new ArrayList<Integer>(); 
list.add(null); 
int x = list.get(0); 

編輯:你可以提供一些格式的文件嗎?

+0

你有什麼期望第二線生產? – DaveH 2012-02-07 14:06:10

回答

11

它拋出NPE因爲編譯器下面的 「魔法」 爲您提供:

Integer i = null; 
if (i.intValue() == 3) 

顯然i.intValue()拋出NPE時inull

+0

這在JLS的任何地方提及嗎? – 2012-02-07 15:10:21

+0

@穆罕默德,我相信它被提及。但我認爲理解編譯器糖的更好方法是編譯代碼,然後使用可用的java反編譯器(例如'jad')對其進行反編譯並查看結果。你會在那裏看到類似的代碼。 – AlexR 2012-02-07 16:54:49

2

認爲包裝類是一個持有者對象。喜歡的東西:

public class Integer { 

private int intValue; 

//getters and setters 

} 

如果指針或引用整個對象是null,你不能得到的值做任何boxing/unboxing操作。

當你說:

if (i == 3) 

unboxingnull參考自動發生,因此例外。

2

當您試圖比較包裝數字與原始包裝數量時,包裝會自動取消裝箱。如果在那一刻,包裝是空的,你會得到一個NullPointerException。這是自動裝箱系統的常見缺陷之一(另一個是性能差,如果你在一個循環中盒/拆箱號)

0

如果它不拆箱整數你會得到像

Integer i1 = -129; 
Integer i2 = -129; 
if (i1 != i2) 
    System.out.println(i1 +" != " + i2); 
奇怪的行爲

Integer i1 = -129; 
if (i1 != new Integer(-129)) 
    System.out.println(i1 +" != " + -129); 

這將打印

-129 != -129 

因爲參考文獻而不是是不同的。