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

 package link.mengya.utils;

 import link.mengya.User;

 import java.util.*;

 /**
  * Created by chang on 16/2/20.
  */
 public class ListTest {
     public static void main(String[] args){
         User user = null;
         List<User> users = null;
         List<User> newUsers = new ArrayList<User>();
         newUsers.add(user);
         newUsers.addAll(users);
     }
 }

如上,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()方法请判空指针的更多相关文章

  1. 找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 JavaFX 应用程序类必须扩展javafx.应用程序类必 须扩展javafx.application.Application”

    用eclipse写代码的时候,写了一个简单的程序,编译的时候突然出现“错误: 在类 com.test.demo 中找不到 main 方法, 请将 main 方法定义为: public static v ...

  2. 错误: 在类 Main 中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 JavaFX 应用程序类必须扩展javafx.application.Application

    错误: 在类 Main 中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args)否则 JavaFX 应用程序类必须扩展ja ...

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

    List的add方法与addAll方法 区别 add add是将传入的参数作为当前List中的一个Item存储,即使你传入一个List也只会另当前的List增加1个元素 addAll addAll是传 ...

  4. 错误: 在类中找不到 main 方法, 请将 main 方法定义为: &#160; &#160;public static void main(String[] args) 否则 JavaFX 应用程序类必须扩展javafx.application.Application 。

    昨天在eclipse编写JAVA程序时,遇到一个问题: 错误: 在类中找不到 main 方法, 请将 main 方法定义为:    public static void main(String[] a ...

  5. List的add方法与addAll方法的区别

    add是将传入的参数作为当前List中的一个Item存储,即使你传入一个List也只会另当前的List增加1个元素addAll是传入一个List,将此List中的所有元素加入到当前List中,也就是当 ...

  6. ArrayList的addAll方法

    方法实现如下: public boolean addAll(Collection c) { Object[] a = c.toArray(); int numNew = a.length; ensur ...

  7. list的add()方法与addAll()方法简介

    简单描述:月读别人的代码,发现了一个有意思的东西,list的一个方法,addAll(),然后就去度娘了一下,发现这个还挺有用的. 吐槽一下:为什么自己没发现这个方法呢?因为平时自己写list的时候,基 ...

  8. 错误 在类中找不到main方法请将main方法定义为 public static void main String args否则JavaFX应用程序类必须扩展javafx-ap

    最近在使用eclipse编写java程序时遇到这样一个问题: 错误在类中找不到main方法,请将main方法定义为 public static void main(String[] args)否则 J ...

  9. 错误: 在类中找不到 main 方法, 请将 main 方法定义为:public static void main(String[] args)否则 JavaFX 应用程序类必须扩展javafx.ap

    最近在使用eclipse编写java程序时遇到这样一个问题: 错误在类中找不到main方法,请将main方法定义为 public static void main(String[] args)否则 J ...

随机推荐

  1. Chrome使用技巧(几个月的心得)

    转用Chrome,不仅仅因为它的插件之丰富,更因为它的响应速度其他浏览器都望尘莫及.接着我就要写写一些心得. 如何最简易地用上谷歌搜索? 1,下载hosts文件:https://pan.baidu.c ...

  2. 详解;(function ($,window,document,undefined){...})(jQuery,window,document);

    1.代码最前面的分号,可以防止多个文件压缩合并以为其他文件最后一行语句没加分号,而引起合并后语法错误. 2.匿名函数(function(){})();:由于Javascript执行表达式是从圆括号里面 ...

  3. github 基础教程推荐

    github现在很火的样子 我在一篇博客上看到说“如果你不知道什么是github,那你就不能说你是个coder,如果你现在看到这篇博客,那么你已经是个coder了”. 我对github一直很好奇,可是 ...

  4. ubuntu修改源列表sourcelist的方法

    1.备份源列表 sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup 2.找到对应版本的源,可以在以下界面当中找到,主要版本要对.htt ...

  5. 流媒体一些server

    (1)darwin stream server (2)red5 (3)nginx rtmp

  6. 最简MacOs10.8安装

    虚拟机中安装Mac Os X的方法网上很多很多,但是对刚接触的朋友来讲肯定不是一件容易的事,这个自己深有体会,包括去年已经装好过,今年再找教程安装都装不起来,期间还出现了各种问题,幸好去年装好之后备份 ...

  7. Android线程池(一)

    本篇文章主要介绍Android自带的线程池的使用. 首先要引入线程池的概念 线程池:是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务. 线程池线程都是后台线程.每个线 ...

  8. android 之 桌面的小控件AppWidget

    AppWidget是创建的桌面窗口小控件,在这个小控件上允许我们进行一些操作(这个视自己的需要而定).作为菜鸟,我在这里将介绍一下AppWeight的简单使用. 1.在介绍AppWidget之前,我们 ...

  9. Tomcat服务器性能优化

    在这篇文章里分以下的七个步骤,按照这些步骤走,Tomcat服务器的性能就能改善哦. 增加JVM堆(heap) 解决内存泄漏问题 线程池(thread pool)的设置 压缩 调节数据库性能 Tomca ...

  10. linux下安装mysql手记

    安装mysql 下载mysql-standard-4.1.8-pc-linux-i686.tar.gz文件到目录/usr/local/下 # groupadd mysql   //添加mysql用户组 ...