我认为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(未知来源)
是的你可以。但是当你将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);
TreeSet的API(http://docs.oracle.com/javase/6/docs/api/java/util/TreeSet.html#add(E))说add会抛出一个NPE:
如果指定的元素为null并且此set使用自然排序,或者其比较器不允许null元素
因此,如果你想存储null,你必须提供一个可以处理这个的比较器,知道null与0或所有其他值相比的位置。
您可以创建自己的“null”值,而不是创建Comparator。
static final Integer NULL = Integer.MIN_VALUE;
set.add(NULL):
您不能将空值插入TreeSet。从JDK 1.7开始,null不被接受到TreeSet中。将null值插入TreeSet将在插入null时抛出NullPointerException原因,它将与现有元素进行比较,并且null不能与任何值进行比较。直到JDK 1.6,第一个元素插入可以为null,但任何更多的null元素都将导致NullPointerException。
如果必须添加null,在这种情况下,您必须编写自己的自定义比较器来处理null或使用commons-collections提供的NullComparator()。