在写代码的时候经常会用到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. [git] ignore文件规则失效

    背景 在某次项目,发现已经将.iml规则写进.ignore文件,但是对.iml的修改依然会出现在changelist中. 解决方案 先引用git官网上的描述 gitignore - Specifies ...

  2. [ASP.NET MVC] 使用Bootsnipp样式

    [ASP.NET MVC] 使用Bootsnipp样式 前言 在「[ASP.NET MVC] 使用Bootstrap套件」这篇文章中,介绍了如何在Web项目里使用Bootstrap套件,让用户界面更加 ...

  3. angularjs的双向数据绑定

    数据绑定有两个方向: 数据 → 界面:我们使用scope对象的$watch()方法监听数据的变化,来更新界面. <html> <head> <title>监听数据& ...

  4. jQuery.merge()

    jQuery.merge( first, second ) //返回Array 合并两个数组内容到第一个数组. first第一个用来合并的数组,元素是第二数组加进来的. second第二个数组合并到第 ...

  5. ArcObject10.1降级至10.0

    最开始接触ArcGIS版本是9.3,为了需要也安装了9.2进行开发:因为自己的电脑配置较低,所以跑不起10.0中文版:毕业工作后,行业内用10.1居多(虽然10.3已出):现在10.4都要出来了:由于 ...

  6. SharePoint 新特性及安装需知

    以下内容转自Kaneboy 大牛,但我在安装正式版的过程中发现一些问题,主要是.net 版本的问题,弄了我一个晚上,我在下面标出来了.我的安装环境是Windows server 2012 R2 关于详 ...

  7. HBase体系结构剖析

    本文出自:http://wuyudong.com/archives/154 在上篇文章<HBase简介>中,已经提到过,HBase中的Table中的所有行都按照row key的字典序排列, ...

  8. CSS ID选择器(三)

    一.ID选择器 ID选择器使用"#"前缀标识符进行标识,后面紧跟指定的元素的ID名称. 如 #box{ width:100px; height:100px;} 元素的ID名称是唯一 ...

  9. Android Design Support Library——Snackbar

    Snackbar是一个轻量级控件,它可以很方便的提供消息的提示和动作反馈,类似于Toast.Snackbar包括一段文字信息与一个可选的操作按钮,超时自动隐藏,也可以通过滑动来删除.效果如下所示: S ...

  10. centos升级mysql至5.7

    1.备份原数据库 [root@www ~] #mysqldump -u root –p -E –all-database > /home/db-backup.sql 加-E是因为mysqldum ...