redimensionar icon adjust java try-catch try-catch-finally

adjust - redimensionar icon java



Prueba-captura-finalmente en java (8)

Cuando un método intenta regresar al llamante, a través de una excepción no detectada o una declaración de devolución explícita, la cláusula finally también se ejecuta justo antes de que el método regrese.

En Java, ¿no se ejecutará el bloque finally si insertamos una declaración de retorno dentro del bloque try de un try-catch-finally?


El bloque finally siempre se ejecutará sin importar si regresa, o si se lanza una excepción dentro del bloque try.

Consulte también la sección 14.19.2 Ejecución de try-catch-finally de la especificación del lenguaje Java


El bloque finalmente se ejecuta en todos estos casos. El punto de ejecutar finalmente el bloque al final es permitirle liberar todos los recursos adquiridos.

A continuación se muestra un ejemplo que muestra cómo funciona.

public class Hello { public static void hello(){ try{ System.out.println("hi"); return; }catch(RuntimeException e){ }finally{ System.out.println("finally"); } } public static void main(String[] args){ hello(); } }


La única vez que no se ejecutará un bloque final es cuando llama a exit() antes de que finally se alcance. La llamada exit() cerrará la JVM, por lo que no se ejecutará ninguna línea de código posterior.

EDIT: Esto no es del todo correcto. Vea los comentarios a continuación para obtener información adicional.


Se ejecuta incluso si vuelves dentro del bloque try. Puse una declaración de retorno dentro de try así como uno dentro de finalmente y el valor devuelto fue finalmente de no intentar.

public class HelloWorld{ public static void main(String args[]){ System.out.println(printSomething()); } public static String printSomething(){ try{ return "tried"; } finally{ return "finally"; } } }

La salida que obtuve fue "finalmente".


Según la explicación oficial :

Nota: Si la JVM se cierra mientras se ejecuta el código de prueba o captura, el bloque finally puede no ejecutarse. Del mismo modo, si el subproceso que ejecuta el código try o catch se interrumpe o se elimina, el bloque finally puede no ejecutarse aunque la aplicación en su totalidad continúe.

Creo que es una buena idea que deberíamos consultar el sitio web oficial antes de publicar una respuesta aquí.


Si llama a System.exit() como dijo otra persona, no se ejecutará, pero creo que tampoco se ejecutará si hay una excepción en el bloque de excepción .


Si su bloque finalmente tiene una devolución, anulará cualquier devolución en un bloque try-catch. Debido a esta "característica", una buena práctica es que finalmente el bloque nunca debe lanzar una excepción o tener una declaración de devolución.