2017-06-15 3 views
3

Aus der Dokumentation von Collection.removeAll():Nullpointer in TreeSet wenn removeAll()

Wirft:NullPointerException - wenn diese Sammlung enthält ein oder mehr null Elemente und die angegebene Sammlung nicht unterstützt null Elemente (optional) oder wenn die angegebene Sammlung null ist.

Aber der Code unten noch ein NullPointerException wirft:

public class TestSet { 
    public static void main(String[] args) { 
     Set set1 = new TreeSet(); 
     set1.add("A"); 
     set1.add("B"); 
     Set set2 = new HashSet(); 
     set2.add(null); 
     set1.removeAll(set2); 
    } 
} 

mir jemand dieses Verhalten kann helfen, zu verstehen?

+1

Nein, es ist nicht zu duplizieren, Sie weisen nur in Frage zu stellen, das gibt defination von NPE hier frage ich etwas anderes –

+0

@ domdom - Bitte entfernen Sie doppelte Tag, und lesen Sie die Frage sorgfältig. –

+1

"Diese Sammlung" bezieht sich auf den Empfänger des 'removeAll'-Aufrufs, d.h.' set1'. In diesem Satz sind keine Nullelemente vorhanden. –

Antwort

4

Ich vermute, dass Javadoc Bedingungen für, wenn NullPointerException von removeAll geworfen werden kann, sind ungenau.

TreeSetremoveAll setzt auf AbstractSet Implementierung. Diese Implementierung iteriert über alle Elemente der kleineren der beiden Mengen.

In Ihrem Schnipsel ist das HashSet, das das Element null enthält. So removeAll iteriert über die HashSet und versucht, jedes Element entfernen sie aus dem TreeSet findet.

jedoch remove von TreeSet wirft ein NullPointerException, wenn von einem null Element zu entfernen versucht, so eingestellt, dass uses natural ordering, or its comparator does not permit null elements.

Zusammenfassend wird die NullPointerException von TreeSet ‚s verursacht remove(), die in der Javadoc von remove() erklärt:

Würfe:

Classcast - wenn das angegebene Objekt nicht verglichen werden kann, die Elemente zur Zeit in dieser Reihe

Nullpointer - , wenn das angegebene Element nu ll und dieser Satz verwendet natürliche Ordnung oder dessen Komparator ermöglicht nicht null Elemente

Es ist interessant festzustellen, dass das Hinzufügen ein weiteres Element zum HashSet die NullPointerException beseitigen würde, da in diesem Fall beide Set s hätte die gleiche Größe und die Umsetzung von removeAll() würden über die Elemente der TreeSet iterieren.

+0

Entsprechend der Stapelüberwachung stammt die NPE von 'getEntry()', nein? Aber das ist pingelig, denke ich. – domsson

+0

@domdom Ich hätte auf die genaue Quelle der NPE hinweisen können, aber da 'TreeSet'' 'remove()' bereits im Javadoc angibt, dass es eine NPE werfen würde, wenn er versucht, ein 'null' Element zu entfernen, tat es dies nicht Es scheint nicht notwendig zu sein. – Eran

+0

Wer wird das an Oracle melden (und wie)? :) – domsson

2

Ok, das Nullpointerexception von remove-Methode von TreeSet geworfen. Im Folgenden ist der Quellcode von removeAll() Methode der TreeSet

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  } 

Die removeAll() Methode intern remove() Aufruf .Seit Sie mit einigen null Werten durchführen, können TreeSet's remove() Verfahren verarbeiten es nicht und somit die Ausnahme.

Nullpointer - wenn das angegebene Element null ist und dieser Satz verwendet natürliche Ordnung, oder dessen Komparator ermöglicht nicht null Elemente

+0

* und die angegebene Sammlung erlaubt keine Null-Elemente * was ist die angegebene Sammlung? Derjenige, der entfernt wird oder der Parameter? –

+0

@ScaryWombat Der, auf dem Sie die removedAll() aufgerufen haben. –

+0

@ScaryWombat: "Die angegebene Sammlung" ist das Argument (während "diese Sammlung" das Objekt ist, dessen Methode aufgerufen wird). – ruakh