Warum Nullzeiger statt Klassenform?


26

In Java:

int count = (Integer) null;

Löst eine java.lang.NullPointerException aus.

Warum wird hierdurch keine Class Cast Exception ausgelöst, um das Verständnis der Programmierer zu erleichtern?

Warum wurde diese Ausnahme einer anderen vorgezogen?

Antworten:


46

Bei der Ausführung Ihres Codes führt die Java-Laufzeit die folgenden Aktionen aus:

  1. Wirf null in ein Objekt der Klasse Integer.
  2. Versuchen Sie, das Integer-Objekt durch Aufrufen der Methode intValue () in ein int-Objekt zu entpacken.
  3. Das Aufrufen einer Methode für ein Nullobjekt löst eine NullPointerException aus.

Mit anderen Worten, null kann problemlos in Integer umgewandelt werden, aber ein null-Integer-Objekt kann nicht in einen Wert vom Typ int konvertiert werden.

BEARBEITEN

Ich hatte vor einiger Zeit eine ähnliche Frage bei Stack Overflow, siehe hier .


1

Java wandelt erfolgreich null in eine Ganzzahlreferenz um, die auf kein Objekt verweist.

Das ist in Ordnung, weil es ein gültiger Status für eine Referenz ist, wenn man nicht auf Distanz ist.

Es ist der Aufruf einer Methode eines nicht existierenden Objekts, die nicht ausgeführt werden kann.

Das Durchführen der Umwandlung entspricht (Integer)nulldem Deklarieren einer Ganzzahlvariablen und dem anschließenden Zuweisen einer neuen (oder bereits vorhandenen) Ganzzahlobjektinstanz.


-1

A Integerin ein intie in auspacken int i = new Integer(15);, ist ieigentlich gleich new Integer(15).intValue() i = (Integer) o; wo Object o = 15ist das selbe wie o = Integer.valueOf(15);aber i = null; wirft ein NullPointerExceptionweil idann gleich null.intValue()was wirft ein NullPointerException.


2
Die Antwort, die vor fast zwei Jahren angenommen wurde, liefert fast die gleiche Erklärung, ist aber klarer. Diese Antwort ist auch für Java 5+ nicht korrekt: Es werden jetzt die valueOf()Factory-Methoden verwendet, anstatt neue Instanzen für das Boxen zu erstellen.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.