¿Por qué un puntero nulo en lugar de un reparto de clase?

26

En Java:

int count = (Integer) null;

lanza una java.lang.NullPointerException.

¿Por qué esto no arroja una excepción Class Cast para facilitar la comprensión del programador?

¿Por qué se eligió esta excepción sobre cualquier otra excepción?

Nathan R
fuente

Respuestas:

46

Al ejecutar su código, el tiempo de ejecución de Java hace lo siguiente:

  1. Lanzar nulo a un objeto de clase Integer.
  2. Intente desempaquetar el objeto Integer en un int llamando al método intValue ()
  3. Llamar a un método en un objeto nulo arroja una NullPointerException.

En otras palabras, nulo se puede convertir a Integer sin problemas, pero un objeto entero nulo no se puede convertir a un valor de tipo int.

EDITAR

Tuve una pregunta relacionada hace un tiempo en Stack Overflow, mira aquí .

Giorgio
fuente
1

Java convierte con éxito nulo en una referencia entera que no hace referencia a ningún objeto.

Eso está bien porque estar sin distancia es un estado válido para una referencia.

Es la invocación de un método de un objeto no existente que no se puede realizar.

Realizar la conversión (Integer)nulles lo mismo que declarar una variable Integer y luego no asignarle una instancia de objeto Integer nueva (o ya existente).

Tulains Córdova
fuente
-1

Para desempaquetar un Integeren un intie en int i = new Integer(15);, en irealidad es igual new Integer(15).intValue() i = (Integer) o; donde Object o = 15es lo mismo que o = Integer.valueOf(15);pero i = null; arroja un NullPointerExceptionporque ientonces es igual a null.intValue()cuál arroja a NullPointerException.

JavaProdigy
fuente
2
La respuesta que fue aceptada hace casi dos años proporciona casi la misma explicación, pero es más clara. Esta respuesta tampoco es correcta para Java 5+: ahora usa los valueOf()métodos de fábrica en lugar de crear nuevas instancias para el boxeo.