10.8 CLÁUSULA FINALLY

 

Y llegamos al último post del bloque de las Excepciones, en este post vamos a ver la cláusula que nos queda por ver, Finally.

Para ver esta cláusula lo vamos a hacer mediante un ejemplo cuyo código es el siguiente:

package er;

 

import java.util.Scanner;

 

import javax.swing.JOptionPane;

 

public class Areas_Peso {

 

      public static void main(String[] args) {

           

            Scanner sc=new Scanner(System.in);

           

            System.out.println("Elige una opción \n1: Cuadrado \n2: Rectángulo \n3: Triángulo \n4: Círculo");

           

            figura=sc.nextInt();

           

            switch(figura) {

           

            case 1:

                 

                  int lado=Integer.parseInt(JOptionPane.showInputDialog("Introduce el lado"));

                 

                  System.out.println(Math.pow(lado, 2));

                 

                  break;

                 

            case 2:

                 

                  int base=Integer.parseInt(JOptionPane.showInputDialog("Introduce el base"));

                 

                  int altura=Integer.parseInt(JOptionPane.showInputDialog("Introduce el altura"));

                 

                  System.out.println("El área del rectángulo es: "+base*altura);

                 

                  break;

                 

            case 3:

                 

                  base=Integer.parseInt(JOptionPane.showInputDialog("Introduce el base"));

                 

                  altura=Integer.parseInt(JOptionPane.showInputDialog("Introduce el altura"));

                 

                  System.out.println("El área del tríangulo es: "+(base*altura)/2);

                 

                  break;

                 

            case 4:

                 

                  int radio=Integer.parseInt(JOptionPane.showInputDialog("Introduce el radio"));

                 

                  System.out.print("El área del circulo es: ");

                 

                  System.out.println(Math.PI*(Math.pow(radio, 2)));

                 

                  break;

                 

                  default:

                       

                        System.out.println("La opción no es correcta");

                 

           

            }

            //............................................

           

            int altura=Integer.parseInt(JOptionPane.showInputDialog("Introduce tu altura en centimetros"));

           

            System.out.println("Si eres hombre tu peso ideal es: "+(altura-110)+" kg.");

           

            System.out.println("Si eres mujer tu peso ideal es: "+(altura-120)+" kg.");

           

           

 

      }

static int figura;

}

Si probamos el programa en la consola nos aparece que seleccionemos una opción vamos a indicarle, por ejemplo, la opción 2:



Introducimos el área del rectángulo:



Introducimos la altura:



Introducimos nuestra altura en centímetros:



El resultado en consola:



El programa funciona correctamente, si nos fijamos en el código cuando utilizamos la clase Scanner siempre nos aparece una advertencia:



Si nos situamos con el ratón sobre esta advertencia:



No es un error es una recomendación y quiere decir que sc no es cerrada nunca cuando creamos una instancia perteneciente a la clase Scanner abrimos una conexión externa con la consola de Eclipse para poder introducir información dentro del programa con lo cual este programa deja una conexión abierta con la consola y no la cierra nunca, la recomendación es que se cierre esa conexión ya que consume muchos recursos al dejarla abierta.

¿Dónde se debe cerrar? Si vemos la clase Scanner la estamos utilizando hasta la línea de código 15:



En esta línea estamos almacenando el próximo entero que introduzcamos por consola una vez que hemos hecho esta operación ya no vamos a necesitar más la consola para introducir datos por lo que a continuación de la línea de código 15 cerraríamos la conexión:



Vemos que con esto la advertencia ya se ha eliminado de la línea de código 11.

Sin embargo, esta aplicación tiene dos partes: una que halla el área de las figuras y otra que halla el peso ideal. Si ejecutamos la aplicación introducimos en consola una opción, por ejemplo, la opción 3:



En lugar de introducir un número entero introducimos texto:



El programa se cae por completo no se ejecuta ni la primera parte ni la segunda:



En este caso si vemos que falla al introducir la opción por lo menos que se ejecute la segunda parte de la aplicación la de hallar el peso ideal. Para solucionarlo debemos saber dónde se produce el error, el error se produce al introducir la opción en esta línea de código:



Por lo que aquí hay que crear un bloque try… catch:

            try {

            figura=sc.nextInt();

           

            sc.close();

            }catch(Exception e) {

                 

                  System.out.println("No has introducido una opción válida");

            }

Dentro del try también estaría el cierre de la conexión a la consola. Si probamos de nuevo:



Se ejecuta lo que hay dentro del catch y también la estructura default del switch no nos va a hallar las áreas de las figuras pero la segunda parte sí que se va a ejecutar:



Vemos el resultado en consola:



Como el try no se ha ejecutado la conexión de la instancia Scanner se ha quedado abierta para solucionarlo se utiliza la cláusula finally que siempre se va a ejecutar haya errores o no:

            try {

            figura=sc.nextInt();

           

     

            }catch(Exception e) {

                 

                  System.out.println("No has introducido una opción válida");

            }finally {

                 

                  sc.close();

                 

            }

De esta manera si se produce un error la conexión a la consola siempre se va a cerrar.

Con este post doy por finalizado el bloque de las Excepciones, todavía queda mucho por ver en Java, espero que continuéis siguiéndome, si tenéis dudas podéis hacérmelo llegar a través de los comentarios del blog. Hasta pronto!

10.7 CAPTURAS DE VARIAS EXCEPCIONES << >> 11.1 INTRODUCCIÓN DEBUGGING




No hay comentarios:

Publicar un comentario