Java Try Catch Finalmente bloquea sin Catch


Estoy revisando un nuevo código. El programa tiene un intento y un bloque finalmente solamente. Dado que el bloque catch está excluido, ¿cómo funciona el bloque try si encuentra una excepción o algo que pueda lanzarse? ¿Va directamente al último bloque?

Author: NullPointer0x00, 2010-12-30

9 answers

Si cualquiera del código en el bloque try puede lanzar una excepción marcada, tiene que 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, independientemente de que se lance o no una excepción.

 105
Author: duffymo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-09 08:58:58

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

  • System.exit() se llama.
  • La JVM se bloquea.
  • El bloque try{} nunca termina (por ejemplo, bucle sin fin).
 81
Author: Peter Lawrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-23 13:43:25

La Especificación del Lenguaje Java(1) describe cómo try-catch-finally se ejecuta. No tener una 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 es asignable al parámetro de cualquier cláusula catch de la instrucción try, entonces {
    • Si el tipo de tiempo de ejecución de V no es asignable al parámetro de cualquier cláusula catch de la instrucción try, entonces el bloque finally se ejecuta. Entonces hay una opción:
      • Si el bloque finally se completa normalmente, entonces la instrucción try se completa abruptamente debido a un lanzamiento del valor V.
      • Si el bloque finally se completa abruptamente por reason S, entonces la sentencia try se completa abruptamente por reason S (y el valor throw de V se descarta y se olvida).

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

 32
Author: Carlos Heuberger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-08 17:29:40

El interior finalmente se ejecuta antes de lanzar la excepción al bloque exterior.

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
 14
Author: skipchaser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-01 15:05:50

El bloque finally siempre se ejecuta después de que finalice el bloque try, ya sea que try termine normalmente o anormalmente debido a una excepción, er, lanzable.

Si una excepción es lanzada por cualquiera de los códigos dentro del bloque try, 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 finalmente lanza una excepción / error / lanzable, y ya hay una pendiente lanzable, se pone feo. Francamente, se me olvida exactamente lo que sucede (tanto para mi certificación hace años). Yo creo que ambos lanzables se enlazan, pero hay algo de 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, vomite.

Por cierto, try/finally es una cosa bastante común para hacer para la gestión de recursos, ya que Java no tiene destructores.

Por ejemplo -

r = new LeakyThing();
try { useResource( r); }
finally { r.release(); }  // close, destroy, etc

"Finalmente", un consejo más: si do molesta para poner en un catch, ya sea atrapar subclases lanzables específicas (esperadas), o simplemente atrapar "Lanzable", no "Excepción", para una trampa de error general catch-all. Demasiados problemas, como los errores de reflexión, arrojan "Errores", en lugar de" Excepciones", y esos se deslizarán por cualquier" captura todo " codificado como:

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

Haga esto en su lugar:

catch ( Throwable t) ...
 5
Author: Roboprog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-30 03:34:03

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 el bloque siempre se ejecutará sin importar lo que esté pasando en el bloque try o/y catch. así que si no hay un bloque catch, la excepción no se manejará aquí.

Sin embargo, todavía necesitará un controlador de excepciones 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.

  • Java try block debe ir seguido de catch o finally block.
  • Para cada bloque try puede haber cero o más bloques catch, pero solo un bloque finally.
  • El bloque finally no se ejecutará si el programa sale(ya sea llamando al Sistema.exit () o causando un error fatal que haga que el proceso se aborte).
 3
Author: roottraveller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-22 06:56:05

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

La excepción es expulsada del bloque, al igual que en cualquier otro caso donde no es capturada.

El bloque finally se ejecuta independientemente de cómo salga el bloque try regardless independientemente de si hay algún catch en absoluto, independientemente de si hay un catch coincidente.

Los bloques catch y finally son partes ortogonales del bloque try. Usted puede tener cualquiera o ambos. Con Java 7, usted será capaz de tener ninguno de los dos!

 2
Author: Andy Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-30 03:24:49

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

 1
Author: Abimaran Kugathasan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-30 02:55:25

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

 1
Author: mP.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-30 03:38:09