El bloque finalmente siempre se ejecuta después de que finaliza el bloque try, ya sea que el try finalice de manera normal o anormal debido a una excepción, er, arrojable.
Si alguno de los códigos del bloque de prueba genera una excepción, el método actual simplemente vuelve a lanzar (o continúa lanzando) la misma excepción (después de ejecutar el bloque finalmente).
Si el bloque finalmente arroja una excepción / error / lanzamiento, y ya hay un lanzamiento pendiente, se pone feo. Francamente, olvido exactamente lo que sucede (tanto por mi certificación hace años). Yo pienso ambos lanzamientos se vinculan entre sí, pero hay que hacer un vudú especial (es decir, una llamada al método que tendría que buscar) para obtener el problema original antes de que el "finalmente" vomitara, er, vomitara.
Por cierto, intentar / finalmente es algo bastante común para la gestión de recursos, ya que Java no tiene destructores.
P.ej -
r = new LeakyThing();
try { useResource( r); }
finally { r.release(); } // close, destroy, etc
"Finalmente", un consejo más: si no se molestan en poner en una captura, ya sea específica de captura (esperado) subclases arrojadizos, o simplemente coger "Throwable", no "excepción", por un cajón de sastre trampa de error general. Demasiados problemas, tales como tonterías de reflexión, arrojan "Errores", en lugar de "Excepciones", y esos se deslizarán por cualquier "capturar todo" codificado como:
catch ( Exception e) ... // doesn't really catch *all*, eh?
haz esto en su lugar:
catch ( Throwable t) ...