HashSet添加null报空指针异常。
public class TestSet {
public static void main(String[] args) {
Set<Integer> hashSet = new HashSet<Integer>();
hashSet.add(2);
hashSet.add(5);
hashSet.add(1);
hashSet.add(null); // will throw null pointer
hashSet.add(999);
hashSet.add(10);
hashSet.add(10);
hashSet.add(11);
hashSet.add(9);
hashSet.add(10);
hashSet.add(000);
hashSet.add(999);
hashSet.add(0);
Iterator<Integer> it = hashSet.iterator();
while(it.hasNext()){
int i = it.next();
System.out.print(i+" ");
}
}
}
Java集合类不能存储基本数据类型(如果要存储基本数据类型可以使用第三方API,如Torve),所以当执行如下代码:
hashSet.add(2);
hashSet.add(5);
实际上执行的是:
hashSet.add(new Integer(2));
hashSet.add(new Integer(5));
向HashSet中添加null值并不是产生空指针异常的原因,HashSet中是可以添加null值的。NPE是因为在遍历set时需要把值拆箱为基本数据类型:
while(it.hasNext()){
int i = it.next();
System.out.print(i+" ");
}
如果值为null,JVM试图把它拆箱为基本数据类型就会导致NPE。 装箱相当于执行Integer.valueOf(100)
。 拆箱相当于执行i.intValue()
。 此时相当于null调用intValue()方法,所以报NPE。 可以把代码修改为:
while(it.hasNext()){
final Integer i = it.next();
System.out.print(i+" ");
}