java - traducir - nullpointerexception processing
¿Por qué "throw null" no crea un error de compilación en Java? (4)
class ThrowNull {
public static void main(String[] args) {
throw null;
}
}
Sabemos que la regla para lanzar es throw ThrowableInstance;
, donde ThrowableInstance
debe ser un objeto de tipo Throwable o una subclase de Throwable.
Los tipos simples, como int o char, así como las clases no tirables, como String y Object, no se pueden usar como excepciones. null
es un literal de Java especial que representa un valor nulo.
Entonces, ¿por qué throw null;
compilar en este código?
Creo que debido a que Null se puede incorporar a cualquier tipo de referencia. En el tiempo de compilación, no hay nada de malo si está lanzando null en lugar de throwable.
De acuerdo con la especificación del lenguaje , una declaración de throw
se define como:
throw Expression
Y si la Expression
evalúa como null
, se NullPointerException
una NullPointerException
. Específicamente,
Si la evaluación de la Expresión se completa normalmente, produciendo un valor
null
, se crea y lanza una instancia V '' de la claseNullPointerException
lugar denull
.
Dado que NullPointerException
extiende RuntimeException
, es una excepción no verificada. Esto podría explicar por qué no hay un error en tiempo de compilación informado de este constructo.
En generel, y no solo tirar. Cualquier variable de objeto se puede asignar nulo. Así que podemos ver que el tiro no es un caso especial. ¿Deberia ser? tal vez. ¿Es consistente? Sí.
Hay muchas cosas que un compilador no verifica, supone que usted hace cosas por una buena razón que tal vez no conozca. Lo que sí intenta prevenir es los errores comunes que cometen los desarrolladores.
Es posible que alguien piense que esta es una buena mano corta para
throw new NullPointerException();
Integer i = null;
try {
i.intValue();
} catch (NullPointerException npe) {
System.err.println("Caught NPE");
npe.printStackTrace();
}
y
try {
throw null;
} catch (NullPointerException npe) {
System.err.println("Caught NPE");
npe.printStackTrace();
}
imprime en Java 6 actualización 38
Caught NPE
java.lang.NullPointerException
at Main.main(Main.java:9)