Collections.addAll()
方法在什么条件下抛出NullPointerException
?官方文件提到:
NullPointerException-如果指定的集合包含null元素,并且此集合不允许null元素,或者指定的集合为null
如何确保此"集合不允许空元素"
public class CollectionImpl {
public void checkList(){
List<String> var1 = new ArrayList<String>();
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);
}
}
输出
var1 : [1, 2, null]
True
var1 : [1, 2, null, 4, 5, null, 6]
使用Collections.addAll()时,Java Collections何时抛出NullPointerException
Collections.addAll
文档告诉我们:
NullPointerException
-如果elements
包含一个或多个null
值,而c
不允许null
元素,或者如果c
或elements
是null
回答您的第二个问题:
我如何确保这个"集合不允许空元素"
通过参考您正在使用的类的文档。在这种情况下(ArrayList
),是第二句话:
实现所有可选的列表操作,并且允许所有元素,包括
null
。
(我的重点。)
如果你不知道你在处理什么类(你只是从其他代码中收到一个List
,不知道它可能是什么类型的列表),你需要在接受它的方法中记录它是否需要支持null
(因为List
没有告诉你的东西;除了尝试添加一个并在没有的情况下捕获异常)。
集合是否支持null
元素是集合实现本身的属性。这不是一个可以在集合的特定实例上更改的设置。正如其他人所提到的,集合是否允许null
应该始终记录在类的规范中。
您的示例使用ArrayList
,它允许使用null
元素,因此使用null
值调用addAll()
将始终成功地将它们添加到列表中。
不允许null
值的Collection
的一个示例是ArrayDeque
。如果您更改var1
的申报如下:
Collection<String> var1 = new ArrayDeque<String>();
那么您将从对CCD_ 28的调用中得到一个抛出的CCD_。
您自己展示了Collection.addAll()
文档。他们回答了这个问题。
我如何确保这个"集合不允许空元素"[?]
如果您询问如何在开发过程中确定给定集合类的实例是否允许null元素,答案是阅读它们的文档。不过,大多数主要的Collection
实现(ArrayList
、LinkedList
、HashSet
…)都接受null
值。也许你最可能遇到的不支持null
s的是一个依赖元素自然排序的TreeSet
,或者一个拒绝null
s的Comparator
。
如果您正在询问如何在运行时确定集合是否接受null
,那么唯一确定的方法是尝试添加一个。如果您获得NullPointerException
,则不支持它们。通常,最好记录外部提供的集合必须接受null
s(如果您依赖它们),或者记录此类集合不能包含null
s(如果null
元素确实没有意义)。如果违反了此类已记录的约束,允许您的代码抛出NullPointerException
(也记录了它会这样做)是完全合理的。事实上,这正是Collection
类所做的。