我不能在SortedSet中放置null吗?

问题描述 投票:8回答:4

我认为null被允许加入Set。 那么为什么以下代码:

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

给出以下例外?

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

java collections treeset sortedset
4个回答
18
投票

是的你可以。但是当你将Comparator与你的套装中的任何其他内容进行比较时,你必须提供自己的null来处理这种情况。应用自然排序后,Java对象不知道如何将自己与null进行比较。相反,null不知道如何将自己与任何对象进行比较,因为你不能称之为null.compareTo(object)

可以在apache Comparator库中找到这种“无效安全”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);

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或所有其他值相比的位置。


2
投票

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

static final Integer NULL = Integer.MIN_VALUE;

set.add(NULL):

0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.