Java removeAll()时树集合中的NullPointerException

Java removeAll()时树集合中的NullPointerException,java,nullpointerexception,Java,Nullpointerexception,从以下文件: 抛出:NullPointerException-如果此集合包含一个或多个 null元素,指定的集合不支持 null元素(可选),或者如果指定的集合为null 但下面的代码仍然会抛出一个错误: 有人能帮我理解这个行为吗?我想Javadoc的whenNullPointerException条件可能是由removeAll引发的,这是不准确的 TreeSet的removeAll依赖于AbstractSet的实现。该实现迭代两个集合中较小集合的所有元素 在代码段中,这是HashSet,它包含

从以下文件:

抛出:
NullPointerException
-如果此集合包含一个或多个 null元素,指定的集合不支持 null元素(可选),或者如果指定的集合为null

但下面的代码仍然会抛出一个错误:


有人能帮我理解这个行为吗?

我想Javadoc的when
NullPointerException
条件可能是由
removeAll
引发的,这是不准确的

TreeSet
removeAll
依赖于
AbstractSet
的实现。该实现迭代两个集合中较小集合的所有元素

在代码段中,这是
HashSet
,它包含
null
元素。因此
removeAll
迭代
HashSet
,并尝试从
TreeSet
中删除它找到的每个元素

但是,
TreeSet
remove
在尝试从
使用自然排序的as集合中删除
null
元素时,或其比较器不允许null元素时抛出
null点异常

总之,
NullPointerException
是由
TreeSet
remove()
引起的,这在
remove()
的Javadoc中有解释:

抛出:

ClassCastException-如果指定的对象无法与此集合中当前的元素进行比较

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


有趣的是,向
HashSet
中再添加一个元素将消除
NullPointerException
,因为在这种情况下,两个
Set
s将具有相同的大小,
removeAll()
的实现将迭代
TreeSet
的元素,从TreeSet的remove方法抛出的
Nullpointerexception
。下面是Treeset的
removeAll()
方法的源代码

public boolean removeAll(Collection<?> c) {
167        boolean modified = false;
168
169        if (size() > c.size()) {
170            for (Iterator<?> i = c.iterator(); i.hasNext(); )
171                modified |= remove(i.next());
172        }
public boolean removeAll(集合c){
167布尔修改=假;
168
169如果(尺寸()>c.尺寸()){
170表示(迭代器i=c.Iterator();i.hasNext();)
171修改的|=删除(i.next());
172        }
removeAll()
方法在内部调用
remove()
。由于您使用一些
null
值执行操作,因此该方法无法处理它,从而导致异常

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


不,它不是重复的,您只是指向给出NPE定义的问题。我在问一些不同的问题。“此集合”指的是
removeAll
调用的接收者,即
set1
。该集合中没有空元素。@EJP这是一个不好的重复。OP不是在问什么是NPE,(s)他问为什么Javadoc中描述的NPE没有出现在本例中。很明显,为什么没有出现,但这并没有包含在dupe中。"尝试添加不合格元素会引发未经检查的异常,通常为NullPointerException或ClassCastException。尝试查询不合格元素的存在可能会引发异常,或者可能只返回false;某些实现将显示前一种行为,而另一些实现将显示后一种行为。更一般地说,尝试如果对一个不合格的元素执行一个操作,而该操作的完成不会导致将一个不合格的元素插入到集合中,则可能会引发指南中的“异常”-在removeAll期间-它将查询具有null的集合s1。您上个月问过这个问题…根据堆栈跟踪,NPE源自
getEntry()
,不是吗?但我想这是吹毛求疵。@domdom我本可以指出NPE的确切来源,但既然
TreeSet
remove()
已经在Javadoc中声明,当试图删除
null
元素时,它会抛出NPE,这似乎没有必要。现在,谁会向Oracle报告(以及如何报告)?:)并且指定的集合不允许为空元素的指定集合?从中删除的集合或参数?@ScaryWombat调用removedAll()的集合。@ScaryWombat:“指定的集合”是参数(而“此集合”是调用其方法的对象)。
public boolean removeAll(Collection<?> c) {
167        boolean modified = false;
168
169        if (size() > c.size()) {
170            for (Iterator<?> i = c.iterator(); i.hasNext(); )
171                modified |= remove(i.next());
172        }