Solucionado (ver solución)
Solucionado
(ver solución)
4
respuestas

Duda al cerrar conexion

Hola! tengo una duda respecto al video de "creando conexion" del bloque "finally y try with resources" en el curso de Java exceptions. En el video se muestra como creamos una class conexion, probamos la conexion, manejamos el error de IllegalState pero me quedo la duda de porque cuando en la clase TestConexion usamos el try catch, no dejamos FUERA de ese bloque el "con.cerrar()", se que el video va destinado para hacer de pie para el bloque de try-catch-finally, pero mas alla de eso, esta bien hacer como yo pense? dejar el "con.cerrar()" luego del catch fuera de su scope?

Caso 1: parte del video

public static void main(String[] args) {

        Conexion conexion = new Conexion();
        try {
            conexion.leerDatos();
            conexion.cerrar(); //Aqui cierra si NO encuentra una excepcion
        }catch (IllegalStateException ex){
            System.out.println("mensaje de excepcion");
            ex.printStackTrace();
        } 
    }

Caso 2: parte del video

public static void main(String[] args) {

        Conexion conexion = new Conexion();
        try {
            conexion.leerDatos();
            conexion.cerrar(); //Aqui cierra si NO encuentra una excepcion
        }catch (IllegalStateException ex){
            System.out.println("mensaje de excepcion");
            ex.printStackTrace();
            conexion.cerrar(); //Aqui cierra SI encuentra una excepcion
        } 
    }

Caso 3: Mi solucion

public static void main(String[] args) {

        Conexion conexion = new Conexion();
        try {
            conexion.leerDatos();
        }catch (IllegalStateException ex){
            System.out.println("mensaje de excepcion");
            ex.printStackTrace();
        } 
        conexion.cerrar(); //Aqui cierra, encuentre o no una excepcion
    }

es una mala practica? o hay algun otro motivo del porque no se vio ese caso particular? de solucionar, soluciona el problema de cerrar la conexion

4 respuestas
solución!

¡Hola Alexis!

En cuanto a tu pregunta, es importante tener en cuenta que el bloque finally se utiliza para ejecutar código que debe ser ejecutado sin importar si se produce una excepción o no. En el caso del video, se muestra cómo se puede utilizar el bloque finally para cerrar la conexión a la base de datos, independientemente de si se produce una excepción o no.

En cuanto a tu solución, es cierto que cerrar la conexión después del bloque catch también funciona, pero no es una buena práctica de programación. Si se produce una excepción, el código después del bloque catch no se ejecutará, lo que significa que la conexión no se cerrará. Además, si se producen varias excepciones en diferentes bloques catch, se tendría que repetir el código para cerrar la conexión en cada uno de ellos.

Por lo tanto, es recomendable utilizar el bloque finally para cerrar la conexión, ya que esto garantiza que se cerrará independientemente de si se produce una excepción o no.

Espero que esto te haya ayudado a resolver tu duda. ¡Buenos estudios!

Hola Eric! Gracias por responder! no es mi intención debatir con vos pero, el bloque try catch está justamente para que el programa sería tratar una excepción y no reviente y corte la ejecución, aunque haya una excepción, el programa continua ejecutándose y llega hasta el final, hasta vaciar la pila de ejecución, yo probé como está aquí en la duda, y si cierra la conexión, haya o no excepción, por eso justamente es la duda, en este caso, con la bomba en el método "leerDatos()" si cierra la conexión, no probé con la bomba en el constructor todavía

¡Hola a ambos! Espero se encuentren de lo mejor.

Coincido con Alexis. Como ya estamos tratando la excepción del método leerDatos() y por consiguiente el flujo del código ya no será interrumpido, la estructura try-catch actúa igual que if-else; por lo que, si la instrucción se debe ejecutar independientemente de la condición (en este caso si hay o no excepción), simplemente se puede poner despues de la estructura para que se ejecute con el flujo normal del código.

Al igual que Alexis ya realicé las pruebas con el debugger para confirmarlo, sin embargo, creo que finally es más una instrucción que hace más legible el código.

Si hay algo que estamos omitiendo, quedamos pendientes de su respuesta.

Saludos y gracias.

Actualizo.

Creo que ya entendí a que se refiere Erick.

Imagina que por alguna razón salta una excepción para la que no estás preparado. En este caso la instrucción que hayaas puesto dentro depues del bloque try-catch no se ejecutaría porque el flujo se interrumpiría. Podrías evitar el uso de finally de las siguientes maneras:

  1. Utilizando polimorfismo. Usarías el tipo Exception para atrapar exepciones de cualquier tipo, evitarias la interrupción del flujo del programa y como consecuencia se ejecutarían todas las intrucciónes despues del bloque; el detalle está en que tu código ya no sería descriptivo respecto a las excepciones que se esperan.
  2. Utilizando un multicatch. Ya sea por medio de pipes o un catch por exepcion, pero esto puede llegar a hacer un código muy extenso; más aún. necesitas saber todos los tipos de errores que puedes esperar.

Tuve un problema como el que planteo hace rato y con el código de la clase, imagina ahora con uno más complicado y extenso. Podría haber alguien que no sepa la importancia de la o las instrucciones que van despues del bloque y realice un cambio que afecte al código. En resumen, considero que finally te permite:

  1. Asegurarte que vas a ejecutar una instrucción pase lo que pase (confiable).
  2. Hacer énfasis en la importancia de la(s) instrucción(es) que contiene para que los que lean tu código lo entiendan (descriptivo).
  3. Reducir la cantidad de codigo escrito (eficiente).

Espero haberte ayudado.

Saludos a ambos.