2014-06-30 19 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); 
    } 
} 

Wynik: wyjątek NullPointerException. Czytałem w wielu artykułach, że pusty TreeSet przyjmą zerowy po raz pierwszy, ale otrzymuję NullPointerException ... Używam java7..can każdy podmiot wyjaśnić moje wątpliwości ....Dodawanie wartości null do pustego obiektu TreeSet generującego wyjątek NullPointerException

+0

Dlaczego chcesz dodać 'null' do' TreeSet'? A jakie artykuły mogą być? – Eypros

+0

Dla mnie kod działa poprawnie na java 1.6. Którą wersję Java używasz? – Jens

+0

Używam wersji java 1.7. – user3516780

Odpowiedz

13

documentation for TreeSet#add w Java 7 państw:

NullPointerException - jeśli określony elementem jest zerowy i ten zestaw wykorzystuje naturalną kolejność lub jego komparator nie zezwala na elementy null

Więc skoro nie określono niestandardową implementację porównawczego, który może obsługiwać wartości null, ty pobierz NPE.

Edit: Można było dodać element null jako pierwszy element TreeSet/TreeMap w Javie 6, ale został uznany za bug:

+0

Dodałem pierwszy element jako null, więc gdzie jest kwestia porównywania obiektów? według mojej wiedzy TreeSet nie będzie porównywał pierwszego elementu i zaakceptuje wartość zerową po raz pierwszy. – user3516780

+0

Dokumentacja jest jasna, a jeśli spojrzysz na kod źródłowy 'TreeSet # add' i' TreeMap # put' (który jest wspierany przez TreeSet), zobaczysz także dlaczego. – NilsH

+0

Dziękuję za odpowiedź. Zrozumiałem dokumentację, ale zachęcamy do odwiedzenia tego filmu https://www.youtube.com/watch? v = 4uvdetsRq90 zobacz o 15:30 min dodał on również wartość drukowaną. czy możesz wyjaśnić moją wątpliwość? – user3516780

2

To dlatego, że na pustym TreeSet na pierwszym elementu A wartość pusta może być wstawiona, ale po wstawieniu tej pierwszej wartości, jeśli próbujemy wstawić jakiekolwiek inne obiekty, otrzymamy NullPointerException.

Dla niepusty numer TreeSet, jeśli próbujemy wstawić wartość null w czasie wykonywania, otrzymasz NullPointerException. Dzieje się tak dlatego, że gdy jakieś elementy istnieją w drzewie, przed wstawieniem dowolnego obiektu porównuje on nowy obiekt z istniejącymi za pomocą metody compareTo() i decyduje, gdzie umieścić nowy obiekt. Więc wstawiając wartość null, metoda compareTo() wewnętrznie wyrzuca NullPointerException.

Myślę, że w nowej wersji Java wstawienie wartości pustej jest niedozwolone.

1

API wyjaśnienie:

Synopsis: Wkładanie Nieprawidłowy element do TreeMap wygeneruje NPE Opis: Z powodu błędu w java.util.TreeMap było wcześniej możliwe, aby wstawić nieprawidłowe elementy null i elementy wykonawcze nie Interfejs porównywalny do pustej TreeMap lub TreeSet. W pustą TreeMap lub TreeSet można wstawić tylko jeden niepoprawny element; dodatkowe elementy spowodowałyby oczekiwany wyjątek NullPointerException lub ClassCastException. Większość innych operacji związanych z kolekcją również zawiedzie. Od wersji Java SE 7 wstawienie nieprawidłowego elementu null lub elementu, który nie implementuje parametru Comparable w pustej TreeMap lub TreeSet, powoduje zgłoszenie wyjątku NullPointerException.

0

Od 1.7 wzwyż null nie jest w ogóle akceptowany przez TreeSet. Jeśli wymusisz dodanie, otrzymamy NullPointerException. Do 1,6 null został przyjęty tylko jako pierwszy element.

Powiązane problemy