2010-03-19 6 views
7

Tome una mirada que el siguiente fragmento de código:`valor de retorno 'de Constructor Exception en Java?

A a = null 
try { 
    a = new A(); 
} finally { 
    a.foo(); // What happens at this point? 
} 

Supongamos que el constructor de la a lanza una excepción de tiempo de ejecución. En la línea marcada, ¿siempre tengo la garantía de obtener una NullPointerException, o se invocará a foo() en una instancia a medio construir?

Respuesta

12

El código dentro del bloque try contiene dos operaciones distintas:

  1. crear una nueva instancia A.
  2. Asigna la nueva instancia a una variable llamada a.

Si se lanza una excepción en el paso 1, el paso 2 no se ejecutará. Por lo tanto, siempre obtendrá un NullPointerException.

+1

Por lo tanto, escríbalo como 'final A a = new A(); prueba {...} finalmente {a.foo(); } ' Y si necesita una excepción atrapada, agregue ** otro ** intente bloquear alrededor del lote. –

+0

o si no está seguro del estado de la referencia 'a' en el bloque finally, simplemente ajuste' a.foo() 'con' (if a! = Null) ' –

6

Si new A() lanza una excepción, siempre obtendrá una NullPointerException porque la asignación a a no sucederá.

1

Creo que siempre obtendrías un NPE en la línea marcada. La tarea nunca tiene la oportunidad de ocurrir.

1

Si la excepción se produjo en el constructor, llame a la nueva A(), esa vez el objeto tiene valor nulo. Por lo tanto, el a.foo() da la excepción de puntero nulo. Puede dar la condición como si (a! = nulo) { a.foo(); }