使用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的区别
java进行list1.addall(list2)之后,list2是保留还是清空了?