Dlaczego wskaźnik zerowy zamiast rzutowania klasowego?

26

W Javie:

int count = (Integer) null;

zgłasza wyjątek java.lang.NullPointerException.

Dlaczego nie rzuca to wyjątku Class Cast dla ułatwienia zrozumienia przez programistów?

Dlaczego ten wyjątek został wybrany w porównaniu z jakimkolwiek innym wyjątkiem?

Nathan R.
źródło

Odpowiedzi:

46

Podczas wykonywania kodu środowisko wykonawcze Java wykonuje następujące czynności:

  1. Rzuć null na obiekt klasy Integer.
  2. Spróbuj rozpakować obiekt Integer na liczbę całkowitą, wywołując metodę intValue ()
  3. Wywołanie metody na obiekcie zerowym powoduje zgłoszenie wyjątku NullPointerException.

Innymi słowy, wartość null może być bez problemu rzutowana na liczbę całkowitą, ale obiektu o wartości całkowitej null nie można przekonwertować na wartość typu int.

EDYTOWAĆ

Miałem podobne pytanie jakiś czas temu w Stack Overflow, patrz tutaj .

Giorgio
źródło
1

Java pomyślnie przekazuje wartość NULL do odwołania do liczby całkowitej, która nie odwołuje się do żadnego obiektu.

To jest OK, ponieważ bycie niezidentyfikowanym jest poprawnym stanem dla odwołania.

Jest to wywołanie metody nieistniejącego obiektu, której nie można wykonać.

Wykonanie rzutowania (Integer)nulljest takie samo, jak zadeklarowanie zmiennej Integer, a następnie nie przypisanie jej nowej (lub już istniejącej) instancji obiektu Integer.

Tulains Córdova
źródło
-1

Rozpakowanie a Integerna intie w int i = new Integer(15);, ifaktycznie jest równe new Integer(15).intValue() i = (Integer) o; gdzie Object o = 15jest to samo co o = Integer.valueOf(15);ale i = null; wyrzuca a, NullPointerExceptionponieważ irówna się, null.intValue()co wyrzuca a NullPointerException.

JavaProdigy
źródło
2
Odpowiedź, która została zaakceptowana prawie dwa lata temu, daje prawie takie samo wyjaśnienie, ale jest bardziej przejrzysta. Ta odpowiedź jest również niepoprawna dla Java 5+: teraz używa ona valueOf()metod fabrycznych zamiast tworzenia nowych instancji dla boksu.