2010-11-24 21 views
100

En este código se establecerá someVar incluso si se ejecuta el bloque catch y se lanza la segunda excepción?¿Se ejecuta finalmente un bloqueo incluso si lanza una nueva excepción?

public void someFunction() throws Exception { 
    try { 
     //CODE HERE 
    } catch (Exception e) { 
     Log.e(TAG, "", e); 
     throw new Exception(e); 
    } finally { 
     this.someVar= true; 
    } 
} 
+2

Porque hay circunstancias en las que el comportamiento no es el esperado, como lo indica @GaryF – jax

+1

Vale la pena señalar que el bloque final puede no ejecutarse como se espera si arroja una excepción o realiza una devolución. –

Respuesta

128

Sí, los bloques finally siempre se ejecuta ... excepto cuando:

  • El hilo conductor del try-catch-finally se mata o se interrumpe
  • Se utilizan System.exit(0);
  • El VM como subyacente destruidos de alguna otra manera
  • El hardware subyacente no se puede utilizar de alguna manera

adición Aliado, si un método en su bloque finally arroja una excepción no detectada, entonces no se ejecutará nada después de eso (es decir, la excepción se lanzará como lo haría en cualquier otro código). Un caso muy común donde esto sucede es java.sql.Connection.close().

Como un lado, supongo que la muestra de código que ha utilizado es simplemente un ejemplo, pero tenga cuidado de poner la lógica real dentro de un bloque finally. El bloque finally está destinado a la limpieza de recursos (cierre de conexiones de BD, liberación de manejadores de archivos, etc.), no para lógica obligatoria. Si debe funcionar, hágalo antes del bloque try-catch, lejos de algo que pueda arrojar una excepción, ya que su intención es prácticamente la misma.

+4

+1 para la lista exhaustiva –

+4

¿Qué quiere decir con "El hilo que ejecuta el bloque try-catch-finally se [...] interrumpe"? Tal vez esa documentación está mal redactada, pero Thread.interrupt() no causará que se omita el bloque finally, ya sea que se haya lanzado desde el try o el catch block. ¿Esto "interrumpido" significa algo más violento, como Thread.stop()? –

+0

@Joe: Sí, creo que la documentación está un poco mal redactada aquí, y que significan una interrupción general de la actividad del hilo. – GaryF

9

Sí.

Véase el documentation:

El bloque finally siempre se ejecuta cuando el bloque try.

Excepciones:

Nota: Si la JVM sale se está ejecutando o código de captura, mientras que la tratan, a continuación, del bloque finally no se ejecuten. Del mismo modo, si el subproceso que ejecuta el código try o catch se interrumpe o se mata, el bloque finally no puede ejecutar aunque la aplicación como en su totalidad continúe.

1

Sí. El bloque finally se ejecuta siempre, excepto en el caso en que llame a System.exit() porque detiene Java VM.

+0

Los ganchos de cierre todavía se invocan después de System.exit(), pero los subprocesos existentes que no son del sistema se detienen todos. –

0

Finalmente se ejecuta siempre, no importa lo que el caso es es decir

  • try-catch-finally
  • tiros

Para excepciones sin marcar, Java no mandato, el manejo de errores. siendo esta la razón, si ocurre una excepción no verificada en el bloque finally y no se realiza ninguna manipulación para eso, el código escrito debajo de este punto (donde ocurrió el error) no se ejecutará.

Por lo tanto, sugiero que siempre se controlen o desmarquen todas las excepciones. de esta manera usted puede asegurarse de que el bloque de código finalmente también se ejecute sin importar si también se produce una excepción sin marcar. tienes un lugar en la captura de nidos secundarios y finalmente bloqueas para realizar tu trabajo necesario.

Cuestiones relacionadas