8

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

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

给出以下异常?


java.lang.Integer.compareTo(Unknown Source) 处
java.lang.Integer.compareTo(Unknown Source) 处
java.util.TreeMap.put(Unknown Source) 处的线程“main”java.lang.NullPointerException 中的异常
。 util.TreeSet.add(未知来源)

4

4 回答 4

19

是的你可以。但是当与您的集合中的任何其他内容进行比较时,您将不得不提供自己的Comparator来处理这种情况。null应用自然排序后,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);
于 2012-07-23T07:48:23.260 回答
6

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

如果指定元素为空且此集合使用自然排序,或者其比较器不允许空元素

因此,如果您想存储 null ,则必须提供一个 Comparator 来处理此问题,并且知道 null 与 0 或所有其他值相比的位置。

于 2012-07-23T07:49:29.420 回答
2

您可以创建自己的“null”值,而不是创建 Comparator。

static final Integer NULL = Integer.MIN_VALUE;

set.add(NULL):
于 2012-07-23T07:50:16.343 回答
0

您不能将空值插入 TreeSet。从 JDK 1.7 开始,TreeSet 不接受 null。将 null 值插入 TreeSet 将引发 NullPointerException,原因是在插入 null 时,它会与现有元素进行比较,并且 null 不能与任何值进行比较。直到 JDK 1.6,第一个元素插入可以为 null,但任何更多的 null 元素将导致 NullPointerException。

如果必须添加 null,在这种情况下,您必须编写自己的自定义比较器来处理 null,或者使用 commons-collections 提供的 NullComparator()。

于 2019-02-27T09:06:45.113 回答