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

tec*_*azi 4 java collections

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

NullPointerException - 如果指定的集合包含null元素,并且此集合不允许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);
     }
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT

var1 : [1, 2, null]
True
var1 : [1, 2, null, 4, 5, null, 6]
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 7

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

Collections.addAll文件告诉我们:

NullPointerException-如果elements包含一个或多个null值,并且c不允许null元件,或者如果c或者elementsnull

回答你的第二个问题:

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

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

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

(我的重点.)

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


Stu*_*rks 5

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

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

Collection不允许使用值的一个示例nullArrayDeque。如果您更改声明var1如下:

Collection<String> var1 = new ArrayDeque<String>();
Run Code Online (Sandbox Code Playgroud)

那么你会NullPointerException从对 的调用中抛出异常addAll()