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 }