当前位置:   article > 正文

HashSet添加null会报空指针异常吗?_hashset null

hashset null

答案:不会报空指针异常

但是下边这种写法在遍历时会报NPE,接下来我们来看下是什么原因

  1. public class TestSet {
  2. public static void main(String[] args) {
  3. Set<Integer> hashSet = new HashSet<Integer>();
  4. hashSet.add(2);
  5. hashSet.add(null);
  6. hashSet.add(333);
  7. hashSet.add(10);
  8. hashSet.add(10);
  9. hashSet.add(11);
  10. hashSet.add(9);
  11. hashSet.add(666);
  12. hashSet.add(0);
  13. Iterator<Integer> it = hashSet.iterator();
  14. while(it.hasNext()){
  15. int i = it.next();
  16. System.out.print(i+"\n");
  17. }
  18. }
  19. }
  • Java中的HashSet是允许添加空值(null)的。
  • 在遍历HashSet时,it.hasNext()方法不会因为HashSet中包含了空值而导致空指针异常。
  • 当调用it.next()方法时,它会返回迭代器所指向的下一个元素,并将迭代器的指针向后移动。如果HashSet中包含了空值(null),那么当迭代器指向空值时,it.next()方法会返回null,并将迭代器的指针向后移动。但是,Java针对这种情况已经进行了处理,在返回null值时不会引发空指针异常。
  • int i = it.next();遍历到null值时,试图进行拆箱, 此时相当于null调用intValue()方法,所以报NPE。 

Java集合类不能存储基本数据类型(如果要存储基本数据类型可以使用第三方API,如Torve),所以当执行如下代码:

  1. hashSet.add(2);
  2. hashSet.add(5);
  3. hashSet.add(8);

实际上执行的是:

  1. hashSet.add(new Integer(2));
  2. hashSet.add(new Integer(9));
  3. hashSet.add(new Integer(18));

向HashSet中添加null值并不是产生空指针异常的原因,HashSet中是可以添加null值的。NPE是因为在遍历set时需要把值拆箱为基本数据类型:

  1. while(it.hasNext()){
  2. int i = it.next();
  3. System.out.print(i+"\n");
  4. }

如果值为null,JVM试图把它拆箱为基本数据类型就会导致NPE。 装箱相当于执行Integer.valueOf(100)。 拆箱相当于执行i.intValue()。 此时相当于null调用intValue()方法,所以报NPE。 可以把代码修改为:

  1. while(it.hasNext()){
  2. final Integer i = it.next();
  3. System.out.print(i+"\n");
  4. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/67291
推荐阅读
相关标签
  

闽ICP备14008679号