将null添加到空的TreeSet会引发NullPointerException异常。

13
import java.util.TreeSet;
class Test 
{
    public static void main(String[] args) 
    {
        TreeSet t=new TreeSet();
        t.add(null);
        System.out.println(t);
    }
}

输出:空指针异常。 我在许多文章中读到空的TreeSet将在第一次接受null,但我得到了空指针异常...我正在使用java7..有人能澄清我的疑惑吗....


为什么要将 null 添加到 TreeSet 中?可能是哪些文章? - Eypros
对我来说,这段代码在Java 1.6上运行良好。你使用的是哪个Java版本? - Jens
我正在使用Java 1.7版本。 - user3516780
在我的情况下,更多的是我不想在将集合转换为 TreeSet 之前剪枝 null。 - djechlin
7个回答

25
Java 7中的TreeSet#add文档中指出:
如果指定的元素为null并且该集合使用自然排序,或者其比较器不允许null元素,则会抛出NullPointerException。
因此,由于您没有指定一个可以处理null值的自定义比较器实现,所以会出现NPE。
编辑:在Java 6中,可以将null元素作为TreeSet/TreeMap的第一个元素添加,但被认为是一个错误。

我将第一个元素添加为null,所以哪里还有比较对象的问题呢?据我所知,TreeSet不会对第一个元素进行比较,并且它将在第一次接受null。 - user3516780
文档很清晰,如果你查看TreeSet#addTreeMap#put的源代码(作为TreeSet的后端),你也会明白其中的原因。 - NilsH
谢谢您的回复。我已经理解了文档,但是请随意查看这个视频 https://www.youtube.com/watch?v=4uvdetsRq90,在15:30分钟处他添加了null并打印了值。您能否澄清我的疑问? - user3516780
在那个视频的评论中说,这在1.6之前是可能的,但在1.7之后就不行了。 - NilsH
Java 6 到 Java 7 的兼容性说明中指出,将“null”添加到“TreeMap”中的可能性是一个错误:http://www.oracle.com/technetwork/java/javase/compatibility-417013.html#behavioral。另请参阅:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5045147。 - NilsH

5
这是因为对于一个空的TreeSet,可以插入一个null值作为第一个元素,但在插入了第一个值之后,如果我们试图插入任何其他对象,则会出现NullPointerException
对于非空的TreeSet,如果我们在运行时尝试插入null值,则会得到NullPointerException。这是因为当树中存在一些元素时,在插入任何对象之前,它使用compareTo()方法将新对象与现有对象进行比较,并决定将新对象放在何处。因此,通过插入null,compareTo()方法在内部抛出NullPointerException
我认为在Java的新版本中不允许插入null。

3

从1.7版本开始,TreeSet不再接受null。如果您强制添加,则会出现NullPointerException异常。在1.6版本之前,只有第一个元素可以是null。


2

API解释:

概要:向TreeMap插入无效元素会抛出NPE 描述:由于java.util.TreeMap中的错误,以前可以将无效的null元素和未实现Comparable接口的元素插入到空的TreeMap或TreeSet中。只能在空的TreeMap或TreeSet中插入一个无效元素;插入其他元素将导致预期的NullPointerException或ClassCastException。对集合进行的大多数其他操作也将失败。从Java SE 7开始,向空的TreeMap或TreeSet插入无效的null元素或未实现Comparable的元素会抛出NullPointerException。


0

TreeSet内部使用Comparable接口按升序对元素进行排序。 Comparable接口的compareTo()方法将两个值相互比较以找到更大的值。如果您将null作为元素添加,则无法将null与其他值进行比较以确定哪个是更大/更大的值,因此compareTo()方法会抛出NullPointerException。

TreeSet中add方法的声明如下:

public boolean add(E e) throws ClassCastException, NullPointerException;


0

对于空的TreeSet,第一个元素可以插入null。 但是,在插入null之后,如果我们尝试插入任何元素,我们将得到NullPointerException。 而且对于空的TreeSet,如果我们尝试插入null,我们将得到NullPointerException。


0
在Java 1.7版本及以后,对于树集中的第一个元素不允许为null,否则会抛出运行时异常-NullPointerException。如果您尝试在Java 1.6中添加null作为第一个元素,它将被编译并运行,但是在添加任何元素之后,它将抛出空指针异常。

据我所见,您的答案与其他答案重复。如果您认为您可以提供更好的答案,请添加额外的信息和解释。 - Maxim Sagaydachny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接