使用List的addAll()方法请判空指针

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用List的addAll()方法请判空指针相关的知识,希望对你有一定的参考价值。

在写代码的时候经常会用到List,Set的addAll()方法,但是要注意addAll()方法不能传入空指针。

 1 package link.mengya.utils;
 2 
 3 import link.mengya.User;
 4 
 5 import java.util.*;
 6 
 7 /**
 8  * Created by chang on 16/2/20.
 9  */
10 public class ListTest {
11     public static void main(String[] args){
12         User user = null;
13         List<User> users = null;
14         List<User> newUsers = new ArrayList<User>();
15         newUsers.add(user);
16         newUsers.addAll(users);
17     }
18 }

如上,newUsers是一个List集合,在调用addAll()方法时传入users,此时users为null,这样会抛出NPE.

Exception in thread "main" java.lang.NullPointerException
    at java.util.ArrayList.addAll(ArrayList.java:559)
    at link.mengya.utils.ListTest.main(ListTest.java:16)

NPE 发生在ArrayList.java中第559行,在ListTest.java的第16行抛出NullPointerException,第15行调用add()方法也传入的是null,但没有抛错。

 

这是为什么呢呢呢???看源码。

ArraryList类的add()方法中并未用传入参数user来进行方法调用。

public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

 

再看ArraryList类的addAll()方法

public boolean addAll(Collection<? extends E> c) {
        Object[] a = c.toArray();               // ArrayList.java:559
     int numNew = a.length;
ensureCapacityInternal(size
+ numNew); // Increments modCount
System.arraycopy(a, 0, elementData, size, numNew);
size
+= numNew; return numNew != 0; }

传入的参数c是null,在执行c.toArray()时出现运行错误。

 

在使用这些常用集合的addAll()方法时,应对传入的参数check null

package link.mengya.utils;

import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import link.mengya.User;

import java.util.*;

/**
 * Created by chang on 16/2/20.
 */
public class ListTest {
    public static void main(String[] args){
        List<User> users1 = null;
        List<User> users2 = new ArrayList<User>();
        users2.add(new User("chang", 24));

        List<User> users = Lists.newArrayList(Iterables.concat(getUsers(users1),getUsers(users2)));
    }

    private static List<User> getUsers(List<User> users) {

        List<User> newUsers = new ArrayList<User>();

        if(users != null){
            newUsers.addAll(users);
        }
        return newUsers;
    }
}

 

扩展:

1.  List的常用实现类ArraryList  LinkedList的addAll方法都不能传入空指针。

2.  HashSet的addAll()方法继承自抽象类AbstractCollection,AbstractCollection的addAll的方法都不能传入空指针。

3.  TreeSet的addAll的方法都不能传入空指针。

 

以上是关于使用List的addAll()方法请判空指针的主要内容,如果未能解决你的问题,请参考以下文章

Java中使用addAll方法,抛出ConcurrentModificationException,请问问题出在哪儿?怎么解决?

List的add方法与addAll方法的区别StringBuffer的delete方法与deleteCharAt的区别

List中Add()与AddAll()的区别

java进行list1.addall(list2)之后,list2是保留还是清空了?

list.addAll(list1),如果list改变,怎么让list1的值不跟着改变!

Optional.ofNullable()方法使用