try todas tipos propagacion las excepciones errores ejemplos catch capturar java try-catch finally try-catch-finally try-finally

todas - Java Try Catch Finally bloquea sin captura



try catch java (9)

Estoy revisando un código nuevo. El programa solo tiene un intento y un bloqueo final. Como se excluye el bloque catch, ¿cómo funciona el bloque try si encuentra una excepción o algo que se pueda arrojar? ¿Va directamente al bloque final?


¿Cómo funciona el bloque try si encuentra una excepción o algo que se pueda arrojar?

La excepción se arroja fuera del bloque, como en cualquier otro caso donde no se detecta.

El bloque finally se ejecuta independientemente de cómo se salga el bloque try, independientemente de si hay alguna captura, independientemente de si hay una captura coincidente.

Los bloques de captura y el final son partes ortogonales del bloque try. Puedes tener cualquiera o ambos. Con Java 7, ¡usted no podrá tener ninguno!


¿No lo intentas con ese programa? Finalmente se bloqueará y se ejecutará el bloque finally, pero la excepción no se manejará. ¡Pero, esa excepción puede ser anulada en el bloque finally!


El bloque finally se ejecuta después de que finalice el bloque try. Si algo se arroja dentro del bloque try cuando sale, se ejecuta el bloque finally.


El bloque finally siempre se ejecuta después de que el bloque try finaliza, ya sea que try finaliza normalmente o de forma anormal debido a una excepción, er, throwable.

Si el código dentro del bloque try arroja una excepción, entonces el método actual simplemente vuelve a lanzar (o continúa lanzando) la misma excepción (después de ejecutar el bloque finally).

Si el bloque finally arroja una excepción / error / throwable, y ya hay un throwable pendiente, se pone feo. Francamente, me olvido exactamente qué sucede (tanto para mi certificación hace años). Creo que ambos throwables se vinculan entre sí, pero hay algún vudú especial que tienes que hacer (es decir, una llamada al método que tendría que buscar) para obtener el problema original antes de que el "finalmente" vomite, er, vomitó.

Por cierto, try / finally es una cosa bastante común que hacer 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 te molestas en atrapar una captura, atrapa subclases arrojables específicas (esperadas), o simplemente atrapa "Throwable", no "Exception", para una trampa general de catch-all error. Demasiados problemas, como errores de reflexión, arrojar "Errores", en lugar de "Excepciones", y esos se deslizarán directamente por cualquier "capturar todos" codificados como:

catch ( Exception e) ... // doesn''t really catch *all*, eh?

haz esto en su lugar:

catch ( Throwable t) ...


El interno finalmente se ejecuta antes de arrojar la excepción al bloque externo.

public class TryCatchFinally { public static void main(String[] args) throws Exception { try{ System.out.println(''A''); try{ System.out.println(''B''); throw new Exception("threw exception in B"); } finally { System.out.println(''X''); } //any code here in the first try block //is unreachable if an exception occurs in the second try block } catch(Exception e) { System.out.println(''Y''); } finally { System.out.println(''Z''); } } }

Resultados en

A B X Y Z


La Especificación del lenguaje Java (1) describe cómo se ejecuta try-catch-finally . No tener captura es equivalente a no tener una captura capaz de atrapar el Lanzable dado.

  • Si la ejecución del bloque try se completa abruptamente debido a un lanzamiento de un valor V, entonces hay una opción:
    • Si el tipo de tiempo de ejecución de V se puede asignar al parámetro de cualquier cláusula catch de la instrucción try, entonces ...
      ...
    • Si el tipo de V en tiempo de ejecución no es asignable al parámetro de ninguna cláusula catch de la instrucción try, entonces se ejecuta el bloque finally . Entonces hay una opción:
      • Si el bloque finally se completa normalmente, la instrucción try se completa abruptamente debido a un lanzamiento del valor V.
      • Si el bloque final se completa abruptamente por la razón S, entonces la instrucción try se completa abruptamente por la razón S (y el lanzamiento del valor V se descarta y se olvida).

(1) Ejecución de try-catch-finally


Las versiones de Java anteriores a la versión 7 permiten estas tres combinaciones de try-catch-finally ...

try - catch try - catch - finally try - finally

finally bloqueo siempre se ejecutará sin importar lo que esté sucediendo en el bloque try o / catch . entonces, si no hay un bloque catch , la excepción no se manejará aquí.

Sin embargo, aún necesitará un controlador de excepción en algún lugar de su código, a menos que desee que su aplicación se bloquee completamente, por supuesto. Depende de la arquitectura de su aplicación, exactamente donde está ese controlador.

  • El bloque try de Java debe ir seguido de un bloque catch o finally.
  • Para cada bloque de prueba, puede haber cero o más bloques de captura, pero solo un bloque finalmente.
  • El bloque finally no se ejecutará si el programa sale (llamando a System.exit () o causando un error fatal que hace abortar el proceso).

Si alguno de los códigos en el bloque try puede arrojar una excepción marcada, debe aparecer en la cláusula throws de la firma del método. Si se lanza una excepción sin marcar, se borra del método.

El bloque finally siempre se ejecuta, ya sea que se genere una excepción o no.


Una pequeña nota sobre try / finally : The finally siempre se ejecutará a menos que

  • System.exit() .
  • La JVM se cuelga.
  • El bloque try{} nunca termina (por ejemplo, bucle infinito).