2012-07-23 38 views
7

我認爲null被允許的Set
那麼,爲什麼下面的代碼:我不能在SortedSet中放置null嗎?

SortedSet<Integer> set = new TreeSet<Integer>(); 
set.add(null); 
set.add(1); //--->Line indicated by exception 

給出了下面的異常?

在線程 「主」 顯示java.lang.NullPointerException處
java.lang.Integer.compareTo(未知來源)
java.lang.Integer.compareTo(未知來源)在
Java異常。 util.TreeMap.put(來源不明)在
java.util.TreeSet.add(來源不明)

回答

16

是的,可以。但你必須提供自己的Comparatornull進行比較,您所設定的其他任何內容,處理的情況。隨着自然順序的應用,Java對象不知道如何將自己與null進行比較。相反,null不知道如何與任何對象進行比較,因爲您無法撥打null.compareTo(object)

這種「無效安全」Comparator的示例實現可以在apache commons-collections庫中找到。檢查出NullComparator。你可以使用它作爲這樣的:

// Unfortunately no support for Java generics yet, in commons-collections 
@SuppressWarnings("unchecked") 
SortedSet<Integer> set = new TreeSet<Integer>(new NullComparator()); 
set.add(null); 
set.add(1); 
+1

+1。輕鬆採用最佳方法。 – 2012-07-23 07:55:08

+0

@Lukas Eder我們可以爲TreeMap做同樣的事嗎?在java 7中,TreeMap和TreeSet都發生了變化(http://bugs.java.com/view_bug.do?bug_id=5045147)。 – 2014-10-01 08:31:58

+0

@AashutoshShrivastava:我認爲這應該是最好的答案在一個新的堆棧溢出問題。隨意創建一個。 – 2014-10-01 17:45:06

5

TreeSet的(http://docs.oracle.com/javase/6/docs/api/java/util/TreeSet.html#add(E))的API表示,加將拋出NPE:

如果指定的元素爲null,並且此set使用自然順序, 或它的比較器不允許空元素

所以如果你想存儲null,你必須提供一個比較器,它可以處理這個知道空位與0或所有其他值相比的位置。

+0

+1解釋爲什麼它不工作,以及如何解決它。 – 2012-07-23 07:55:34

2

而是創造一個比較,你可以創建自己的「空」的價值。

static final Integer NULL = Integer.MIN_VALUE; 

set.add(NULL): 
+2

考慮到所有整數值都有含義,這可能是一種不可接受的方法。如果使用的數字限制在特定的範圍內,則此方法可能是可以接受的。 – 2012-07-23 07:54:32

+2

MIN_VALUE是最不可能有用的,因爲像'x == -x && x!= 0'這樣的奇特屬性;)通常不需要每個'int'值,但它使用的是Long可能是一個選擇。 – 2012-07-23 08:01:48

+0

哈,我從來沒有想過'MIN_VALUE'的'x == -x'。當二進制補碼不是您的主要專業領域時,這非常令人吃驚...... – 2012-07-23 08:04:20

相關問題