2014-06-30 9 views
5
import java.util.TreeSet; 
class Test 
{ 
    public static void main(String[] args) 
    { 
     TreeSet t=new TreeSet(); 
     t.add(null); 
     System.out.println(t); 
    } 
} 

Ausgabe: NullPointerException. las ich in vielen Artikeln, die leer TreeSet werden erstmals null annehmen, aber Nullpointer ist immer ... bin mit java7..can jeden Körper meine Zweifel klären ....Hinzufügen von null zu leerem TreeSet Erhöhen von NullPointerException

+0

Warum möchten Sie 'null' zu einem 'TreeSet' hinzufügen? Und welche Artikel könnte das sein? – Eypros

+0

Für mich funktioniert der Code auf Java 1.6. Welche Java Version verwendest du? – Jens

+0

Ich benutze Java 1.7 Version. – user3516780

Antwort

13

Die documentation for TreeSet#add in Java 7 heißt es:

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

So, da Sie nicht eine benutzerdefinierte Komparator Implementierung angegeben haben, die Nullwerte verarbeiten kann, Sie Nimm die NPE.

Edit: Es war möglich, ein null Element als erstes Element eines TreeSet/TreeMap in Java 6, aber es wurde als hinzuzufügen ein bug:

+0

Ich habe das erste Element als null hinzugefügt, also wo ist die Frage des Vergleichs von Objekten? meines Wissens wird TreeSet nicht für das erste Element vergleichen und es wird null für das erste Mal akzeptieren. – user3516780

+0

Die Dokumentation ist klar, und wenn Sie sich den Quellcode von 'TreeSet # add' und' TreeMap # put' anschauen (der das TreeSet unterstützt), sehen Sie auch warum. – NilsH

+0

Vielen Dank für Ihre Antwort. Ich habe Dokumentation verstanden, aber fühlen Sie sich frei, dieses Video https://www.youtube zu besuchen.com/watch? v = 4uvdetsRq90 siehe um 15:30 Minuten fügte er null und gedruckten Wert auch hinzu. kannst du meine Zweifel klären – user3516780

2

Dies liegt daran, für eine leere TreeSet am ersten ein Element NULL-Wert kann eingefügt werden, aber nach dem Einfügen dieses ersten Werts, wenn wir versuchen, andere Objekte einzufügen, erhalten wir eine NullPointerException.

Für eine nicht leere TreeSet, wenn wir versuchen, einen Nullwert zur Laufzeit einfügen, erhalten Sie eine NullPointerException. Dies liegt daran, dass wenn einige Elemente in der Struktur vorhanden sind, vor dem Einfügen eines Objekts das neue Objekt mit den vorhandenen Objekten unter Verwendung der compareTo()-Methode verglichen wird und entschieden wird, wo das neue Objekt abgelegt werden soll. Durch das Einfügen von null löst die compareTo() Methode intern NullPointerException aus.

Ich denke, in der neuen Version von Java ist die Null-Insertion nicht erlaubt.

1

API Erklärung:

Synopsis: ein ungültiges Element in ein TreeMap Einfügen löst eine NPE Beschreibung: Aufgrund eines Fehlers in java.util.TreeMap, war es bisher möglich war ungültig null Elemente und Elemente zum Einfügen nicht Umsetzung die Vergleichbare Schnittstelle in eine leere TreeMap oder TreeSet. Nur ein einziges ungültiges Element könnte in eine leere TreeMap oder TreeSet eingefügt werden. zusätzliche Elemente würden die erwartete NullPointerException oder ClassCastException verursachen. Die meisten anderen Vorgänge bei der Sammlung würden ebenfalls fehlschlagen. Ab Java SE 7 wird durch das Einfügen eines ungültigen Nullelements oder eines Elements, das Comparable nicht implementiert, in eine leere TreeMap oder TreeSet eine NullPointerException ausgelöst.

0

Ab 1.7 wird null von TreeSet überhaupt nicht akzeptiert. Wenn Sie das Hinzufügen erzwingen, erhalten wir NullPointerException. Till 1.6 wurde nur als erstes Element akzeptiert.

Verwandte Themen