[英]is there a java 8 syntax for collections.addAll to work with null parameters?
[英]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
NullPointerException
- 如果elements
包含一個或多個null
值,並且c
不允許null
元素,或者c
或elements
為null
回答你的第二個問題:
如何確保此“集合不允許null元素”
通過參考您正在使用的課程的文檔。 在這種情況下( ArrayList
) ,它是第二句話:
實現所有可選列表操作,並允許所有元素,包括
null
。
(我的重點。)
如果你不知道你正在處理什么類(你只是從其他代碼接收一個List
而不知道/不知道它可能是什么類型的列表),你需要在接受它的方法中記錄是否它需要支持null
(因為List
沒有告訴你的東西;除了嘗試添加一個並捕獲異常,如果它沒有)。
您自己提供了Collection.addAll()
文檔。 他們回答了這個問題。
如何確保此“集合不允許空元素”[?]
如果您在開發期間詢問如何確定給定集合類的實例是否允許null元素,那么答案是閱讀其文檔。 但是,大多數主要的Collection
實現( ArrayList
, LinkedList
, HashSet
,...)都接受null
值。 也許你最不可能遇到的那個不支持null
的是一個TreeSet
,它依賴於元素的自然順序或者拒絕null
的Comparator
。
如果您詢問如何在運行時確定集合是否接受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.