2011-07-06 12 views
30
class ThrowNull { 
    public static void main(String[] args) { 
     throw null; 
    } 
} 

Sabemos que la regla para throw es throw ThrowableInstance;, donde ThrowableInstance debe ser un objeto de tipo Throwable o una subclase de Throwable.¿Por qué "throw null" no crea un error de compilación en Java?

Los tipos simples, como int o char, así como las clases no arrastrables, como String y Object, no pueden utilizarse como excepciones. null es un literal de Java especial que representa un valor nulo.

¿Por qué entonces compilar throw null; en este código?

+3

¿Por qué debería provocar un error en tiempo de compilación? – BoltClock

+0

Aunque el compilador de Java no lo señala como un problema en este momento (a menos que la especificación del lenguaje cambie en algún momento futuro), claramente es un candidato para verificadores estáticos como "Sonar" para eliminar y señalar el desarrollador. Tal vez el desarrollador quería escribir "return null" ... –

+2

Sabemos que la regla es que el resultado de llamar a 'String a() {return null}' debe ser un objeto de (sub) clase o String. Las clases simples, como Throwable o BigInteger no se pueden usar como cadenas. Null es un literal de Java especial que representa un valor nulo.Entonces, ¿por qué 'return null' no está creando ningún error de tiempo de compilación ????? !!!! Estoy exponiendo tus dobles estándares aquí. ¿Por qué te quejas de 'throw null' pero no de' return null'? No puedo renunciar a tu pregunta por lo tanto. Está muy localizado por medio de dobles estándares. – Val

Respuesta

54

De acuerdo con la language specification, una declaración throw se define como:

throw Expression 

Y si el Expression evalúa a null, a continuación, se lanza un NullPointerException. Específicamente,

Si la evaluación de la Expresión se completa normalmente, produciendo un valor null, a continuación, una instancia V' de clase NullPointerException es creado y lanzado en lugar de null.

Dado que NullPointerException se extiende a RuntimeException, se trata de una excepción no comprobada. Esto podría explicar por qué no hay un error en tiempo de compilación informado de este constructo.

5

Hay muchas cosas que un compilador no verifica, supone que usted hace cosas por una buena razón que podría no conocer. Lo que intenta evitar es los errores comunes que cometen los desarrolladores.

Es posible que alguien piensa que esto 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(); 
} 

grabados en 6 actualización de Java 38

Caught NPE 
java.lang.NullPointerException 
    at Main.main(Main.java:9) 
+0

@DanielWerner Todas las excepciones y errores y detectables incluso OutOfmemoryError y ThreadDeath. ;) Ver mi ejemplo. –

2

En generel, y no solo tirar. Cualquier variable de objeto se puede asignar nulo. Entonces podemos ver que lanzar no es un caso especial. ¿Deberia ser? tal vez. ¿Es consistente? Sí.

3

Creo que porque 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.

+0

Exactamente. Su método, que devuelve un String, puede devolver nulo. ¿Por qué la variable de cadena puede ser nula pero la variable de Throwable no puede? OP definitivamente es miope (x) o ejerce un doble estándar. – Val

+0

Esto puede sonar bien, pero no es cierto. Ver la respuesta aceptada. – Vlasec

Cuestiones relacionadas