Sí, los bloques finalmente siempre se ejecutan ... excepto cuando:
- El hilo que ejecuta el bloque try-catch-finally se mata o se interrumpe
- Tu usas
System.exit(0);
- La VM subyacente se destruye de alguna otra manera.
- El hardware subyacente es inutilizable de alguna manera.
Además, si un método en su bloque finalmente arroja una excepción no detectada, entonces nada más se ejecutará (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()
.
Por otro 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 finalmente. El último bloque está destinado a la limpieza de recursos (cierre de conexiones de base de datos, liberación de identificadores de archivos, etc.), no para la lógica de ejecución obligatoria. Si debe ejecutarse, hágalo antes del bloque try-catch, lejos de algo que pueda generar una excepción, ya que su intención es casi funcionalmente la misma.