Integer i = null;
if (i == 3)
为什么上面的第二行抛出一个NullPointerException
,恕我直言,这只有一个含义,即包装对象i
将被取消装箱,产生例外情况,如:
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(null);
int x = list.get(0);
编辑:你能为我提供一些格式的文档吗?
答案 0 :(得分:11)
它会抛出NPE,因为编译器会为您执行以下“魔术”:
Integer i = null;
if (i.intValue() == 3)
当i.intValue()
为i
时,null
显然会引发NPE。
答案 1 :(得分:2)
将包装类视为持有者对象。类似的东西:
public class Integer {
private int intValue;
//getters and setters
}
如果指针或对整个对象的引用为null
,则无法获得值以执行任何boxing/unboxing
操作。
当你说:
if (i == 3)
unboxing
引用自动null
,因此例外。
答案 2 :(得分:2)
当您尝试将包装数字与原始数字进行比较时,包装器会自动取消装箱。如果在那一刻,包装器为null,则会出现NullPointerException。这是自动装箱系统常见的陷阱之一(另一个是如果你在循环中装箱/取消箱号码,表现不佳)
答案 3 :(得分: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
因为引用而不是值是不同的。
答案 4 :(得分:-1)
在比较之前,可以避免检查value是否为null。
if (dto.getMethod() != null && dto.getMethod() == 0) // Safe check no NPE
以下页面提供了一个很好的包装来避免NPE
http://www.javawiki.org/wiki/Avoid_NullPointerException_on_Primitive_Wrapper_Objects