El uso de Java Finally como clausula que cierra recursos , es algo obligatorio a conocer . Muchas veces surge la pregunta de para qué sirve exactamente Java Finally en nuestro código. Vamos a ver un ejemplo elemental de la división de dos números enteros. Recordemos que es una operación que no se puede realizar y la maquina virtual de Java lanzará una excepción que podemos capturar con un bloque try/catch (hubiera sido mejor comprobar el valor).
package com.arquitecturajava;
public class Principal {
public static void main(String[] args) {
int a =5;
int b=0;
try {
int resultado=a/b;
System.out.println(resultado);
} catch (Exception e) {
System.out.println("la aplicacion fallo");
}
System.out.println("se cierran los recursos");
System.out.println("la aplicacion finalizado");
}
}
Java sin Finally
El resultado lo podemos ver en la consola:
Una excepción salta y es captura se emite un mensaje de error se cierran los recursos y la aplicación finaliza
Podemos realizar una operación similar con la clausula finally
Todo parece quedar un poco más ordenado
package com.arquitecturajava;
public class Principal2 {
public static void main(String[] args) {
int a =5;
int b=0;
try {
int resultado=a/b;
System.out.println(resultado);
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("la aplicacion fallo");
}finally {
System.out.println("se cierran los recursos");
}
System.out.println("la aplicacion finalizado");
}
}
Sin embargo el resultado es el mismo:
Java Finally
En muchas ocasiones la gente suele preguntar para qué es necesario usar java finally . La respuesta es que finally asegura siempre el cierre de los recursos y se ejecuta ocurra lo que ocurra en el programa. Por ejemplo supongamos que se produce una excepción dentro de la clausula catch.
package com.arquitecturajava;
public class Principal1 {
public static void main(String[] args) {
int a =5;
int b=0;
try {
int resultado=a/b;
System.out.println(resultado);
} catch (Exception e) {
System.out.println("la aplicacion fallo");
throw new NullPointerException();
}
System.out.println("se cierran los recursos");
System.out.println("la aplicacion finalizado");
}
}
En este caso el programa finaliza.
pero no llega a cerrar los recursos y eso supone un problema.
Es algo a veces difícil de ver pero son cosas que ocurren. Si una excepción es lanzada en la cláusula catch los recursos no se cerrarán . Ahora bien si hemos hecho uso de java finally la situación cambia.
package com.arquitecturajava;
public class Principal3 {
public static void main(String[] args) {
int a =5;
int b=0;
try {
int resultado=a/b;
System.out.println(resultado);
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("la aplicacion fallo");
throw new NullPointerException();
}finally {
System.out.println("se cierran los recursos");
}
System.out.println("la aplicacion finalizado");
}
}
Es cierto que la aplicación ha fallado y revienta
Pero también es cierto que la cláusula finally se ejecuta y cierra los recursos que están abiertos .
De ahí la importancia de hacer uso de la cláusula y entender como funciona correctamente.