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.
Porque hay circunstancias en las que el comportamiento no es el esperado, como lo indica @GaryF – jax
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. –