Integer i = null;
if (i == 3)
爲什麼上面的第二線拋出一個NullPointerException
,IMHO,這僅具有一個的含義,是包裝對象i
是要取消裝箱其產生異常,例如:檢查空包裝器對基本值
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(null);
int x = list.get(0);
編輯:你可以提供一些格式的文件嗎?
Integer i = null;
if (i == 3)
爲什麼上面的第二線拋出一個NullPointerException
,IMHO,這僅具有一個的含義,是包裝對象i
是要取消裝箱其產生異常,例如:檢查空包裝器對基本值
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(null);
int x = list.get(0);
編輯:你可以提供一些格式的文件嗎?
它拋出NPE因爲編譯器下面的 「魔法」 爲您提供:
Integer i = null;
if (i.intValue() == 3)
顯然i.intValue()
拋出NPE時i
是null
。
這在JLS的任何地方提及嗎? – 2012-02-07 15:10:21
@穆罕默德,我相信它被提及。但我認爲理解編譯器糖的更好方法是編譯代碼,然後使用可用的java反編譯器(例如'jad')對其進行反編譯並查看結果。你會在那裏看到類似的代碼。 – AlexR 2012-02-07 16:54:49
認爲包裝類是一個持有者對象。喜歡的東西:
public class Integer {
private int intValue;
//getters and setters
}
如果指針或引用整個對象是null
,你不能得到的值做任何boxing/unboxing
操作。
當你說:
if (i == 3)
的unboxing
在null
參考自動發生,因此例外。
當您試圖比較包裝數字與原始包裝數量時,包裝會自動取消裝箱。如果在那一刻,包裝是空的,你會得到一個NullPointerException。這是自動裝箱系統的常見缺陷之一(另一個是性能差,如果你在一個循環中盒/拆箱號)
如果它不拆箱整數你會得到像
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
因爲參考文獻而不是值是不同的。
這可以避免在比較之前檢查值是否爲空。
if (dto.getMethod() != null && dto.getMethod() == 0) // Safe check no NPE
下頁提供了一個很好的包裝,以避免對NPE
http://www.javawiki.org/wiki/Avoid_NullPointerException_on_Primitive_Wrapper_Objects
你有什麼期望第二線生產? – DaveH 2012-02-07 14:06:10