检查Null Wrappers是否符合原始值

时间:2012-02-07 14:01:04

标签: java expression wrapper boxing

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

为什么上面的第二行抛出一个NullPointerException,恕我直言,这只有一个含义,即包装对象i将被取消装箱,产生例外情况,如:

ArrayList<Integer> list = new ArrayList<Integer>();
list.add(null);
int x = list.get(0);
编辑:你能为我提供一些格式的文档吗?

5 个答案:

答案 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