Java Collections何时在使用Collections.addAll()时抛出NullPointerException

在什么条件下Collections.addAll()方法抛出NullPointerException ? 官方文件提到:

NullPointerException – 如果指定的collection包含null元素且此collection不允许null元素,或者指定的collection为null

如何确保此“集合不允许null元素”

 public class CollectionImpl { public void checkList(){ List var1 = new ArrayList(); var1.add("One"); var1.add("Two"); var1.add("Three"); System.out.println("var1 : " + var1); try{ if(Collections.addAll(var1,"Four" , "Five" , null , "1")){ System.out.println("True"); } } catch(NullPointerException e){ System.out.println("Caught Null Pointer Exception" + e); } catch(IllegalArgumentException e){ System.out.println("Caught IllegalArgument Exception" + e); } finally{ System.out.println("var1 : " + var1); } } 

OUTPUT

 var1 : [1, 2, null] True var1 : [1, 2, null, 4, 5, null, 6] 

集合是否支持null元素是集合实现本身的属性。 它不是可以在集合的特定实例上更改的设置。 正如其他人所提到的,集合允许null是否应始终记录在类的规范中。

您的示例使用允许null元素的ArrayList ,因此使用null值调用addAll()将始终成功将它们添加到列表中。

不允许null值的Collection的示例是ArrayDeque 。 如果您更改var1的声明,如下所示:

 Collection var1 = new ArrayDeque(); 

那么你将从调用addAll()抛出一个NullPointerException

Java Collections何时在使用Collections.addAll()时抛出NullPointerException

Collections.addAll文档告诉我们 :

NullPointerException – 如果elements包含一个或多个null值,并且c不允许null元素,或者celementsnull

回答你的第二个问题:

如何确保此“集合不允许null元素”

通过参考您正在使用的课程的文档。 在这种情况下( ArrayList ) ,它是第二句话:

实现所有可选列表操作,并允许所有元素,包括null

(我的重点。)

如果你不知道你正在处理什么类(你只是从其他代码收到一个List而不知道/不知道它可能是什么类型的列表),你需要在接受它的方法中记录是否它需要支持null (因为List没有告诉你的东西;除了尝试添加一个并捕获exception,如果它没有)。

您自己提供了Collection.addAll()文档。 他们回答了这个问题。

如何确保此“集合不允许空元素”[?]

如果您询问如何在开发期间确定给定集合类的实例是否允许null元素,那么答案是阅读其文档。 但是,大多数主要的Collection实现( ArrayListLinkedListHashSet ,…)都接受null值。 也许你最有可能遇到的不支持null的是一个TreeSet ,它依赖于元素的自然顺序或者拒绝nullComparator

如果您询问如何在运行时确定集合是否接受null ,那么唯一可靠的方法是尝试添加一个。 如果您收到NullPointerException ,则不支持它们。 通常,最好记录外部提供的集合如果依赖它们必须接受null ,或者记录如果null元素没有意义,则此类集合必须不包含null 。 允许你的代码抛出NullPointerException如果违反了这些记录的约束(并且记录它也会这样做)是完全合理的。 实际上,这正是Collection的类所做的。