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



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元素,或者如果celementsnull

回答您的第二个问题:

我如何确保这个"集合不允许空元素"

通过参考您正在使用的类的文档。在这种情况下(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实现(ArrayListLinkedListHashSet…)都接受null值。也许你最可能遇到的不支持nulls的是一个依赖元素自然排序的TreeSet,或者一个拒绝nulls的Comparator

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

最新更新