2010-03-10 7 views
8

Sabemos que no importa si se lanza una excepción, o si se captura y se maneja, el bloque finally se ejecutará, así que tenía curiosidad de que haya alguna posibilidad de que finalmente el bloque no se ejecute.¿Existe la posibilidad de que un bloque finally no se ejecute?

Y si se llama a System.exit() en try o catch, ¿entonces también se llamará finalmente?

+8

Si saca el enchufe de su pc, el bloque finally no se ejecutará. – Fortega

Respuesta

21

Si la JVM sale mientras se está ejecutando el código try o catch, entonces el bloque finally no puede ejecutar. Del mismo modo, si el subproceso que ejecuta el código try o catch se interrumpe o cancela, el bloque finally no se ejecutará aunque la aplicación como un todo continúe.

Fuente: java.sun.com: Java Tutorial: The finally Block

+1

tome nota de la palabra "may" allí. – Joset

2

Una cosa que se me ocurre en este momento es un OutOfMemoryError en cuyo caso existe la posibilidad de que ningún código adicional en su aplicación puede ser ejecutada.

+0

Incluso en el caso de un OutOfMemoryError, se ejecutará el bloque finally. La ejecución del bloque finally en sí mismo puede provocar un OutOfMemoryError en sí mismo, pero eso también puede ocurrir, incluso si el bloque try se completó satisfactoriamente. – jarnbjo

6

System.exit() impedirá la ejecución de un bloque finally.

0

Si se segfaults de algún método Java Native Interface (una función de biblioteca fuera de java pero llamada desde allí) no se invocará finalmente un método porque se detiene toda la JVM.

Los errores en la propia JVM también provocan un bloqueo y evitan que todo continúe la ejecución.

1

System.exit (1); puede utilizar

2
try { 
    System.out.println("BEFORE"); 
    System.exit(0); 
    System.out.println("AFTER"); 
} finally { 
    System.out.println("FINALLY"); 
} 

esto le dará la salida:

BEFORE 
0

el fin cláusula en el bloque de excepción try-catch ejecuta siempre, independientemente de la ocurrencia de excepción en el flujo del programa java normal. Si el flujo de ejecución se detiene antes de la cláusula finally, el bloque finally no se ejecutará.

podemos usar System.exit(1); antes de bloquear y detener el flujo de ejecución del programa.

Cuestiones relacionadas