traducir sale porque pointer java exception-handling nullpointerexception

java - sale - nullpointerexception processing



¿Por qué puedo tirar nulo en Java? (7)

Al ejecutar esto:

public class WhatTheShoot { public static void main(String args[]){ try { throw null; } catch (Exception e){ System.out.println(e instanceof NullPointerException); System.out.println(e instanceof FileNotFoundException); } } }

La respuesta es:

true false

Lo que fue bastante impresionante para mí. Habría pensado que esto sería un error de tiempo de compilación.

¿Por qué puedo lanzar null en Java y por qué se envía a una NullPointerException?

(En realidad, no sé si es un "upcast", dado que estoy lanzando nulo)

Aparte de una pregunta de entrevista realmente estúpida (por favor, nadie pregunte esto en una entrevista) no veo ninguna razón para throw null . Tal vez quieras ser despedido, pero eso es ... quiero decir, ¿por qué otra persona throw null ?

Dato curioso, IntelliJ IDEA 12 me dice que mi línea, una e instanceof NullPointerException , siempre será falsa. Lo que no es verdad en absoluto.


No lo sé con certeza, pero supongo que "lanzar nulo"; no funciona, e intentarlo hace que el programa genere una excepción, y esa excepción es (excepción de percusión) ...


Parece que no es que null se trate como una NullPointerException , sino que el hecho de intentar throw null arroja una NullPointerException .

En otras palabras, throw comprueba que su argumento no es nulo y, si es nulo, lanza una NullPointerException .

JLS 14.18 specifies este comportamiento:

Si la evaluación de la Expresión se completa normalmente, produciendo un valor nulo, se crea y lanza una instancia V ''de la clase NullPointerException en lugar de nula. La declaración de lanzamiento luego se completa abruptamente, la razón es un lanzamiento con valor V ''.


Pensarlo de esta manera lo hace un poco más obvio por qué funciona esto:

try { Exception foo = null; if(false) { foo = new FileNotFoundException(); } // Oops, forgot to set foo for the true case.. throw foo; } catch (Exception e){ System.out.println(e instanceof NullPointerException); System.out.println(e instanceof FileNotFoundException); }


Se comporta de acuerdo con el specifies :

Si la evaluación de la Expresión se completa normalmente, produciendo un valor nulo, se crea y lanza una instancia V ''de la clase NullPointerException en lugar de nula.


bharal ... Se ve un error compilador javac. Creo que se introdujo en SE 5. Null puede asignarse a cualquier tipo de referencia. Sin embargo, "el tipo de nulo" no es en sí mismo un tipo de referencia. El programa lo compila porque null puede simplemente convertir en Exception. Y, además, buscar referencias de objetos después de la declaración y como nulo puede funcionar como una referencia de objetos, muestra el resultado.

El documento de JLS sobre lanzar como:

“Una declaración de lanzamiento primero evalúa la Expresión. Si la evaluación de la Expresión se completa abruptamente por alguna razón, entonces el lanzamiento se completa abruptamente por esa razón. Si la evaluación de la Expresión se completa normalmente, produciendo un valor no nulo V, entonces la declaración de lanzamiento se completa abruptamente, la razón es una tirada con el valor V. Si la evaluación de la Expresión se completa normalmente, produciendo un valor nulo, entonces una instancia V '' de la clase NullPointerException se crea y lanza en lugar de null. La declaración de lanzamiento luego se completa abruptamente, la razón es un lanzamiento con valor V ''".


null se puede convertir en cualquier cosa *, incluida una excepción. Del mismo modo que podría devolver el valor nulo si la firma de su método especifica que debe devolver una excepción (o incluso una cadena o clase de persona), puede lanzarla.

* Excluyendo los tipos primitivos.


¿Por qué lo envía a una NullPointerException?

Según specifies :

Una declaración de lanzamiento primero evalúa la expresión. Si la evaluación de la Expresión se completa abruptamente por alguna razón, entonces el lanzamiento se completa abruptamente por esa razón. Si la evaluación de la Expresión se completa normalmente, produciendo un valor no nulo V, entonces la declaración de lanzamiento se completa abruptamente, la razón es una tirada con el valor V. Si la evaluación de la Expresión se completa normalmente, produciendo un valor nulo, entonces una instancia V '' de la clase NullPointerException se crea y lanza en lugar de null. La declaración de lanzamiento luego se completa abruptamente, la razón es un lanzamiento con valor V ''.

¿Por qué puedo tirar nula en java?

Puede lanzar objetos de tipo Throwable y dado que null es una referencia válida para Throwable , el compilador lo permite.

Esto es lo que dice Neal Gafter

Aunque null es asignable a cada tipo de referencia, el tipo de null no es en sí mismo un tipo de referencia. Nuestra intención era que el requisito de que la expresión en una declaración de lanzamiento fuera un tipo de referencia se eliminara de la tercera edición del JLS, pero ese cambio nunca llegó a la versión publicada. Por lo tanto, este es un error del compilador javac que introduje en SE 5.