簡體   English   中英

Java Collections何時在使用Collections.addAll()時拋出NullPointerException

[英]When does Java Collections throw a NullPointerException while using Collections.addAll()

在什么條件下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);
     }
}

OUTPUT

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

Java Collections何時在使用Collections.addAll()時拋出NullPointerException

Collections.addAll文檔告訴我們

NullPointerException - 如果elements包含一個或多個null值,並且c不允許null元素,或者celementsnull

回答你的第二個問題:

如何確保此“集合不允許null元素”

通過參考您正在使用的課程的文檔。 這種情況下( ArrayList ,它是第二句話:

實現所有可選列表操作,並允許所有元素,包括null

(我的重點。)

如果你不知道你正在處理什么類(你只是從其他代碼接收一個List而不知道/不知道它可能是什么類型的列表),你需要在接受它的方法中記錄是否它需要支持null (因為List沒有告訴你的東西;除了嘗試添加一個並捕獲異常,如果它沒有)。

您自己提供了Collection.addAll()文檔。 他們回答了這個問題。

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

如果您在開發期間詢問如何確定給定集合類的實例是否允許null元素,那么答案是閱讀其文檔。 但是,大多數主要的Collection實現( ArrayListLinkedListHashSet ,...)都接受null值。 也許你最不可能遇到的那個不支持null的是一個TreeSet ,它依賴於元素的自然順序或者拒絕nullComparator

如果您詢問如何在運行時確定集合是否接受null ,那么唯一可靠的方法是嘗試添加一個。 如果您收到NullPointerException ,則不支持它們。 通常情況下,最好記錄外部提供的集合如果依賴它們必須接受null ,或者記錄如果null元素沒有意義,則此類集合必須不包含null 允許你的代碼拋出NullPointerException如果違反了這些記錄的約束(並且記錄它也會這樣做)是完全合理的。 實際上,這正是Collection的類所做的。

集合是否支持null元素是集合實現本身的屬性。 它不是可以在集合的特定實例上更改的設置。 正如其他人所提到的,集合允許null是否應始終記錄在類的規范中。

您的示例使用ArrayList ,它允許使用null元素,因此使用null值調用addAll()將始終成功將它們添加到列表中。

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

Collection<String> var1 = new ArrayDeque<String>();

那么你將從調用addAll()拋出一個NullPointerException

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM