使用List的addAll()方法请判空指针
在写代码的时候经常会用到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()方法请判空指针的更多相关文章
- 找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 JavaFX 应用程序类必须扩展javafx.应用程序类必 须扩展javafx.application.Application”
用eclipse写代码的时候,写了一个简单的程序,编译的时候突然出现“错误: 在类 com.test.demo 中找不到 main 方法, 请将 main 方法定义为: public static v ...
- 错误: 在类 Main 中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args) 否则 JavaFX 应用程序类必须扩展javafx.application.Application
错误: 在类 Main 中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args)否则 JavaFX 应用程序类必须扩展ja ...
- List的add方法与addAll方法的区别、StringBuffer的delete方法与deleteCharAt的区别
List的add方法与addAll方法 区别 add add是将传入的参数作为当前List中的一个Item存储,即使你传入一个List也只会另当前的List增加1个元素 addAll addAll是传 ...
- 错误: 在类中找不到 main 方法, 请将 main 方法定义为:    public static void main(String[] args) 否则 JavaFX 应用程序类必须扩展javafx.application.Application 。
昨天在eclipse编写JAVA程序时,遇到一个问题: 错误: 在类中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] a ...
- List的add方法与addAll方法的区别
add是将传入的参数作为当前List中的一个Item存储,即使你传入一个List也只会另当前的List增加1个元素addAll是传入一个List,将此List中的所有元素加入到当前List中,也就是当 ...
- ArrayList的addAll方法
方法实现如下: public boolean addAll(Collection c) { Object[] a = c.toArray(); int numNew = a.length; ensur ...
- list的add()方法与addAll()方法简介
简单描述:月读别人的代码,发现了一个有意思的东西,list的一个方法,addAll(),然后就去度娘了一下,发现这个还挺有用的. 吐槽一下:为什么自己没发现这个方法呢?因为平时自己写list的时候,基 ...
- 错误 在类中找不到main方法请将main方法定义为 public static void main String args否则JavaFX应用程序类必须扩展javafx-ap
最近在使用eclipse编写java程序时遇到这样一个问题: 错误在类中找不到main方法,请将main方法定义为 public static void main(String[] args)否则 J ...
- 错误: 在类中找不到 main 方法, 请将 main 方法定义为:public static void main(String[] args)否则 JavaFX 应用程序类必须扩展javafx.ap
最近在使用eclipse编写java程序时遇到这样一个问题: 错误在类中找不到main方法,请将main方法定义为 public static void main(String[] args)否则 J ...
随机推荐
- Chrome使用技巧(几个月的心得)
转用Chrome,不仅仅因为它的插件之丰富,更因为它的响应速度其他浏览器都望尘莫及.接着我就要写写一些心得. 如何最简易地用上谷歌搜索? 1,下载hosts文件:https://pan.baidu.c ...
- 详解;(function ($,window,document,undefined){...})(jQuery,window,document);
1.代码最前面的分号,可以防止多个文件压缩合并以为其他文件最后一行语句没加分号,而引起合并后语法错误. 2.匿名函数(function(){})();:由于Javascript执行表达式是从圆括号里面 ...
- github 基础教程推荐
github现在很火的样子 我在一篇博客上看到说“如果你不知道什么是github,那你就不能说你是个coder,如果你现在看到这篇博客,那么你已经是个coder了”. 我对github一直很好奇,可是 ...
- ubuntu修改源列表sourcelist的方法
1.备份源列表 sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup 2.找到对应版本的源,可以在以下界面当中找到,主要版本要对.htt ...
- 流媒体一些server
(1)darwin stream server (2)red5 (3)nginx rtmp
- 最简MacOs10.8安装
虚拟机中安装Mac Os X的方法网上很多很多,但是对刚接触的朋友来讲肯定不是一件容易的事,这个自己深有体会,包括去年已经装好过,今年再找教程安装都装不起来,期间还出现了各种问题,幸好去年装好之后备份 ...
- Android线程池(一)
本篇文章主要介绍Android自带的线程池的使用. 首先要引入线程池的概念 线程池:是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务. 线程池线程都是后台线程.每个线 ...
- android 之 桌面的小控件AppWidget
AppWidget是创建的桌面窗口小控件,在这个小控件上允许我们进行一些操作(这个视自己的需要而定).作为菜鸟,我在这里将介绍一下AppWeight的简单使用. 1.在介绍AppWidget之前,我们 ...
- Tomcat服务器性能优化
在这篇文章里分以下的七个步骤,按照这些步骤走,Tomcat服务器的性能就能改善哦. 增加JVM堆(heap) 解决内存泄漏问题 线程池(thread pool)的设置 压缩 调节数据库性能 Tomca ...
- linux下安装mysql手记
安装mysql 下载mysql-standard-4.1.8-pc-linux-i686.tar.gz文件到目录/usr/local/下 # groupadd mysql //添加mysql用户组 ...