赞
踩
答案:不会报空指针异常
但是下边这种写法在遍历时会报NPE,接下来我们来看下是什么原因
- public class TestSet {
- public static void main(String[] args) {
- Set<Integer> hashSet = new HashSet<Integer>();
-
- hashSet.add(2);
- hashSet.add(null);
- hashSet.add(333);
- hashSet.add(10);
- hashSet.add(10);
- hashSet.add(11);
- hashSet.add(9);
- hashSet.add(666);
- hashSet.add(0);
-
- Iterator<Integer> it = hashSet.iterator();
- while(it.hasNext()){
- int i = it.next();
- System.out.print(i+"\n");
- }
- }
- }
it.hasNext()
方法不会因为HashSet中包含了空值而导致空指针异常。it.next()
方法时,它会返回迭代器所指向的下一个元素,并将迭代器的指针向后移动。如果HashSet中包含了空值(null),那么当迭代器指向空值时,it.next()
方法会返回null,并将迭代器的指针向后移动。但是,Java针对这种情况已经进行了处理,在返回null值时不会引发空指针异常。Java集合类不能存储基本数据类型(如果要存储基本数据类型可以使用第三方API,如Torve),所以当执行如下代码:
- hashSet.add(2);
- hashSet.add(5);
- hashSet.add(8);
实际上执行的是:
- hashSet.add(new Integer(2));
- hashSet.add(new Integer(9));
- hashSet.add(new Integer(18));
向HashSet中添加null值并不是产生空指针异常的原因,HashSet中是可以添加null值的。NPE是因为在遍历set时需要把值拆箱为基本数据类型:
- while(it.hasNext()){
- int i = it.next();
- System.out.print(i+"\n");
- }
如果值为null,JVM试图把它拆箱为基本数据类型就会导致NPE。 装箱相当于执行Integer.valueOf(100)
。 拆箱相当于执行i.intValue()
。 此时相当于null调用intValue()方法,所以报NPE。 可以把代码修改为:
- while(it.hasNext()){
- final Integer i = it.next();
- System.out.print(i+"\n");
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。