我不能在SortedSet中放置null吗?

Cra*_*lus 8 java collections sortedset treeset

我认为这null是允许的Set.
那么为什么以下代码:

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

给出以下例外?

java 中java.util.TreeMap.put(未知来源)的
java.lang.Integer.compareTo(未知来源)中的
java.lang.Integer.compareTo(未知来源)中的线程"main"java.lang.NullPointerException中的异常. util.TreeSet.add(未知来源)

Luk*_*der 18

是的你可以.但是,Comparatornull与套装中的任何其他内容进行比较时,您必须提供自己的处理案例.应用自然排序后,Java对象不知道如何比较自己null.反过来,null不知道如何将自己与任何对象进行比较,因为你无法调用null.compareTo(object).

Comparator可以在apache commons-collections库中找到这种"null-safe"的示例实现.看看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);
Run Code Online (Sandbox Code Playgroud)


Kor*_*gen 6

TreeSet的API(http://docs.oracle.com/javase/6/docs/api/java/util/TreeSet.html#add ( E))说add会抛出一个NPE:

如果指定的元素为null并且此set使用自然排序,或者其比较器不允许null元素

因此,如果你想存储null,你必须提供一个可以处理这个的比较器,知道null与0或所有其他值相比的位置.