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
元素,或者c
或elements
为null
回答你的第二个问题:
如何确保此“集合不允许null元素”
通过参考您正在使用的课程的文档。 在这种情况下( ArrayList
) ,它是第二句话:
实现所有可选列表操作,并允许所有元素,包括
null
。
(我的重点。)
如果你不知道你正在处理什么类(你只是从其他代码收到一个List
而不知道/不知道它可能是什么类型的列表),你需要在接受它的方法中记录是否它需要支持null
(因为List
没有告诉你的东西;除了尝试添加一个并捕获exception,如果它没有)。
您自己提供了Collection.addAll()
文档。 他们回答了这个问题。
如何确保此“集合不允许空元素”[?]
如果您询问如何在开发期间确定给定集合类的实例是否允许null元素,那么答案是阅读其文档。 但是,大多数主要的Collection
实现( ArrayList
, LinkedList
, HashSet
,…)都接受null
值。 也许你最有可能遇到的不支持null
的是一个TreeSet
,它依赖于元素的自然顺序或者拒绝null
的Comparator
。
如果您询问如何在运行时确定集合是否接受null
,那么唯一可靠的方法是尝试添加一个。 如果您收到NullPointerException
,则不支持它们。 通常,最好记录外部提供的集合如果依赖它们必须接受null
,或者记录如果null
元素没有意义,则此类集合必须不包含null
。 允许你的代码抛出NullPointerException
如果违反了这些记录的约束(并且记录它也会这样做)是完全合理的。 实际上,这正是Collection
的类所做的。