java - studio - programacion android pdf 2018
¿Por qué usamos finalmente bloques? (9)
Por lo que puedo decir, los dos siguientes fragmentos de código tendrán el mismo propósito. ¿Por qué finally
tienen bloques?
Código A:
try { /* Some code */ }
catch { /* Exception handling code */ }
finally { /* Cleanup code */ }
Código B:
try { /* Some code */ }
catch { /* Exception handling code */ }
// Cleanup code
Aunque nuestra aplicación está cerrada con fuerza, habrá algunas tareas que debemos ejecutar (como liberación de memoria, cierre de base de datos, bloqueo de liberación, etc.), si escribe estas líneas de código en el bloque finally
se ejecutará si se lanza una excepción o no...
Su aplicación puede ser una colección de hilos, Exception
termina el hilo pero no toda la aplicación, en este caso finally
es más útil.
En algunos casos, finally
no se ejecutará, como JVM Fail, Thread terminate, etc.
Es posible que desees ejecutar el código que desees de todos modos, independientemente de lo que ocurra en tu bloque try o catch.
Además, si está utilizando capturas múltiples y si desea poner algún código que sea común para todos los bloques de captura, este sería un lugar para poner, pero no puede estar seguro de que se haya ejecutado todo el código en prueba.
Por ejemplo:
conn c1 = new connection();
try {
c1.dosomething();
} catch (ExceptionA exa) {
handleexA();
//c1.close();
} catch (ExceptionB exb) {
handleexB();
//c1.close();
} finally {
c1.close();
}
Finalmente siempre se ejecuta, mientras que su código después de la captura no.
Porque necesita que el código se ejecute independientemente de las excepciones que se puedan lanzar. Por ejemplo, puede que necesite limpiar algún recurso no administrado (el compilador ''using'' se compila en un bloque try / finally).
Puede haber ocasiones en las que desee ejecutar una pieza de código pase lo que pase. Si se lanza una excepción o no. Entonces uno usa finally
.
Si catch block arroja cualquier excepción, el código restante no se ejecutará, por lo tanto, tenemos que escribir el bloque finaly.
Tenga en cuenta que (al menos en Java, probablemente también en C #), también es posible tener un bloque try
sin catch
, pero con un finally
. Cuando ocurre una excepción en el bloque try
, el código en el bloque finally
se ejecuta antes de que la excepción se lance más arriba:
InputStream in = new FileInputStream("somefile.xyz");
try {
somethingThatMightThrowAnException();
}
finally {
// cleanup here
in.close();
}
finally
SIEMPRE se ejecuta, a menos que la JVM se haya cerrado, finally
solo proporciona un método para colocar el código de limpieza en un solo lugar.
Sería demasiado tedioso si tuviera que poner el código de limpieza en cada uno de los bloques de catch
.
- ¿Qué sucede si se lanza una excepción que no está manejando? (Espero que no estés atrapando a
Throwable
...) - ¿Qué sucede si regresas desde el interior del bloque de prueba?
- ¿Qué sucede si el bloque catch lanza una excepción?
Un bloque finally
se asegura de que, como salga de ese bloque (modulé algunas formas de abortar todo el proceso explícitamente), se ejecutará. Eso es importante para la limpieza determinista de los recursos.