Java 将null添加到空树集引发NullPointerException

Java 将null添加到空树集引发NullPointerException,java,nullpointerexception,treeset,Java,Nullpointerexception,Treeset,输出:NullPointerException。 我在许多文章中读到,空树集将第一次接受null,但我得到了NullPointerException…我在使用java7..有人能澄清我的疑问吗..Java 7中的状态: NullPointerException-如果指定的元素为null,并且此集合使用自然排序,或者其比较器不允许null元素 因此,由于您没有指定可以处理空值的自定义比较器实现,因此您得到了NPE 编辑:可以添加null元素作为Java 6中TreeSet/TreeMap的第一个元

输出:NullPointerException。 我在许多文章中读到,空树集将第一次接受null,但我得到了NullPointerException…我在使用java7..有人能澄清我的疑问吗..

Java 7中的状态:

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

因此,由于您没有指定可以处理空值的自定义比较器实现,因此您得到了NPE


编辑:可以添加
null
元素作为Java 6中
TreeSet
/
TreeMap
的第一个元素,但它被认为是:

这是因为对于第一个元素处的空
TreeSet
,可以插入null值,但是在插入第一个值之后,如果我们试图插入任何其他对象,那么我们将得到一个
NullPointerException

对于非空的
TreeSet
,如果我们试图在运行时插入空值,您将得到
NullPointerException
。这是因为当树中存在某些元素时,在插入任何对象之前,它会使用
compareTo()
方法将新对象与现有对象进行比较,并决定将新对象放置在何处。因此,通过插入null,
compareTo()
方法在内部抛出
NullPointerException

我认为新版本的Java不允许空插入。

API解释:

简介:在树映射中插入无效元素会引发NPE
描述:由于java.util.TreeMap中的错误,以前可能会在空TreeMap或TreeSet中插入无效的null元素和未实现可比接口的元素。只能将单个无效元素插入空树映射或树集;其他元素将导致预期的NullPointerException或ClassCastException。集合上的大多数其他操作也会失败。从Java SE 7开始,在空树映射或树集中插入无效的null元素或未实现Comparable的元素会引发NullPointerException。

从1.7开始,树集根本不接受null。如果您强制添加,那么我们将得到NullPointerException。直到1.6 null才被接受为第一个元素。

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

树集合中add方法的声明为


public boolean add(E)抛出ClassCastException、NullPointerException

,因为第一个元素空插入是可能的。 但是在插入null之后,如果我们试图插入任何元素,我们将得到NullPointerException。
对于空树集,如果我们试图插入null,我们将从1.7版以后的Java中获得NullPointerException

,对于树集,不允许第一个元素为null,因为它将给出运行时异常-NullPointerException。
同样,如果您可以在java 1.6中尝试,当在第一个元素上添加null时,它也会被编译并运行,但是在添加任何元素之后,它都会给出null点异常。

为什么要将
null
添加到
TreeSet
?那可能是哪篇文章呢?对我来说,代码在Java1.6上运行良好。您使用哪个java版本?我使用的是java 1.7版本。@在我的例子中,我更不想在转换到树集之前删除集合中的空值。我将第一个元素添加为空值,那么比较对象的问题在哪里?据我所知,TreeSet不会对第一个元素进行比较,它会第一次接受null。文档很清楚,如果您查看
TreeSet#add
TreeMap#put
(支持TreeSet)的源代码,你也会明白原因的。谢谢你的回复。我理解文档,但可以随意访问此视频。15:30分钟,他还添加了空值和打印值。你能澄清我的疑问吗?它在视频的评论中说,它在1.6之前是可能的,但在1.7之前是不可能的。它在Java 6到Java 7的兼容性说明中说,将
null
添加到
TreeMap
的可能性是一个bug:。另请参阅:据我所知,您的答案与其他答案重复。如果您认为您可以提供更好的答案,请添加额外的信息和解释。
import java.util.TreeSet;
class Test 
{
    public static void main(String[] args) 
    {
        TreeSet t=new TreeSet();
        t.add(null);
        System.out.println(t);
    }
}