Excepciones en Java con Ejemplos

Manejo de excepciones en Java con ejemplos

Vamos a ver varios ejemplos que nos pueden ser útiles para saber cómo manejar las excepciones que se pueden producir en un programa Java. En particular veremos varios ejemplos sobre cómo tratar la excepción InputMismatchException. Es una excepción muy común que se produce cuando se introduce un valor no válido en la lectura por teclado de valores numéricos. 
Esta excepción se produce cuando se espera un valor numérico y se introduce una letra, una cadena de caracteres o un valor numérico con un formato no válido. Es estos casos si la excepción no se captura se muestra un error y el programa finaliza. El objetivo es poder capturarla y volver a pedir el valor numérico no válido introducido.

Ejemplo 1: Tratamiento de excepciones para la lectura por teclado de cuatro números enteros.

Este ejemplo lo vamos a resolver de tres formas diferentes.

Solución 1: Un solo bloque try que contiene la lectura de todos los números. El inconveniente de hacerlo de esta forma es que si hay un error en la lectura de uno de los números se deben introducir todos de nuevo.
public class Excepciones1 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int x = 0, y = 0, z = 0, k = 0;
        boolean repetir;
        do {
            repetir = false;
            try {
                System.out.print("Introduce primer número entero: ");                                             
                x = sc.nextInt();

                System.out.print("Introduce segundo número entero: ");
                y = sc.nextInt();

                System.out.print("Introduce tercer número entero: ");
                z = sc.nextInt();

                System.out.print("Introduce cuarto número entero: ");
                k = sc.nextInt();
            } catch (InputMismatchException e) {
                System.out.println("Valor no válido" + e.toString());                                             
                sc.nextLine();
                repetir = true;
            }
        } while (repetir);
        System.out.println("int introducido -> " + x);
        System.out.println("int introducido -> " + y);
        System.out.println("int introducido -> " + z);
        System.out.println("int introducido -> " + k);
    }

}

Solución 2: Un bloque try..catch para cada lectura. En este caso la ventaja respecto a la solución anterior es que si hay un error en la lectura de uno de los números solamente se vuelve a pedir el número erróneo. El inconveniente de hacerlo de esta forma es la duplicidad de código.

public class Excepciones1-2 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int x = 0, y = 0, z = 0, k = 0;
        boolean repetir;
        do {
            repetir = false;
            try {
                System.out.print("Introduce primer número entero: ");
                x = sc.nextInt();
            } catch (InputMismatchException e) {
                System.out.println("Valor no válido" + e.toString());                                             
                sc.nextLine();
                repetir = true;
            }
        } while (repetir);
        do {
            repetir = false;
            try {
                System.out.print("Introduce segundo número entero: ");
                y = sc.nextInt();
            } catch (InputMismatchException e) {
                System.out.println("Valor no válido" + e.toString());
                sc.nextLine();
                repetir = true;
            }
        } while (repetir);
        do {
            repetir = false;
            try {
                System.out.print("Introduce tercer número entero: ");
                z = sc.nextInt();
            } catch (InputMismatchException e) {
                System.out.println("Valor no válido" + e.toString());
                sc.nextLine();
                repetir = true;
            }
        } while (repetir);
        do {
            repetir = false;
            try {
                System.out.print("Introduce cuarto número entero: ");                                             
                k = sc.nextInt();
            } catch (InputMismatchException e) {
                System.out.println("Valor no válido" + e.toString());
                sc.nextLine();
                repetir = true;
            }
        } while (repetir);
        System.out.println("int introducido -> " + x);
        System.out.println("int introducido -> " + y);
        System.out.println("int introducido -> " + z);
        System.out.println("int introducido -> " + k);
}

Solución 3: Escribir un método para realizar la lectura del número entero. Dentro del método será donde se controle la excepción. La ventaja de hacerlo así que sque si hay un error solo se vuelve a pedir el número no válido y además evitamos la duplicidad de código.

public class Excepciones1-3 {

    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {

        int x = 0, y = 0, z = 0, k = 0;
        
        x = leerEntero("Introduce primer número entero: ");
        y = leerEntero("Introduce segundo número entero: ");
        z = leerEntero("Introduce tercer número entero: ");
        k = leerEntero("Introduce cuarto número entero: ");                                                       

        System.out.println("int introducido -> " + x);
        System.out.println("int introducido -> " + y);
        System.out.println("int introducido -> " + z);
        System.out.println("int introducido -> " + k);
    }

    public static int leerEntero(String s) {
        boolean repetir;
        int n = 0;
        do {
            repetir = false;
            try {
                System.out.print(s);
                n = sc.nextInt();
            } catch (InputMismatchException e) {
                System.out.println("Valor no válido");                                                            
                repetir = true;
                sc.nextLine();
            } 
        } while (repetir);
        return n;
    }

}

Ejemplo 2: Tratamiento de excepciones para leer dos números de tipo int, un String y dos números de tipo double y mostrar los valores leídos por pantalla. Se realizará un método para leer un  número int y otro para leer un double. En estos métodos se realiza el control de excepciones en la lectura por teclado.
Solución:
public class Excepciones2 {

    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {

        int x = 0, y = 0;
        double m = 0, n = 0;
        String s;

        x = leerEntero("Introduce un número entero: ");
        y = leerEntero("Introduce otro número entero: ");
        
        System.out.print("Introduce un texto: ");
        s = sc.nextLine();
        
        m = leerDouble("Introduce un número double: ");
        n = leerDouble("Introduce otro número double: ");

        System.out.println("primer int introducido -> " + x);
        System.out.println("segundo int introducido -> " + y);
        System.out.println("primer double introducido -> " + m);
        System.out.println("segundo double introducido -> " + n);                                                 
        System.out.println("Texto introducido: " + s);
    }

    //Método para leer un número de tipo int y controlar la excepción
    public static int leerEntero(String s) {
        boolean repetir;
        int n=0;
        do {
            repetir = false;
            try {
                System.out.print(s);
                n = sc.nextInt();
            } catch (InputMismatchException e) {
                System.out.println("Valor no válido");
                repetir = true;
            }finally {
                sc.nextLine();
            }
        } while (repetir);
        return n;
    }
    
    //Método para leer un número de tipo double y controlar la excepción
    public static double leerDouble(String s) {
        boolean repetir;
        double n=0;
        do {
            repetir = false;
            try {
                System.out.print(s);
                n = sc.nextDouble();
            } catch (InputMismatchException e) {
                System.out.println("Valor no válido");                                                            
                repetir = true;
            }finally {
                sc.nextLine();
            }
        } while (repetir);
        return n;
    }
}

Ejemplo 3: En este caso se proporciona un código Java y se pide tratar las excepciones que se pueden producir.
public class Excepciones3 {

    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {

        double n;
        int posicion;
        String cadena ;
        double[] valores = {9.83, 4.5, -3.06, 0.06, 2.52, -11.3, 7.60, 3.00, -30.4, 105.2};                       

        System.out.println("Contenido del array antes de modificar:");
        for (int i = 0; i < valores.length; i++) {
            System.out.printf("%.2f ", valores[i]);
        }

        System.out.print("\n\nIntroduce la posición del array a modificar: ");
        cadena = sc.nextLine();
        posicion = Integer.parseInt(cadena);

        System.out.print("\nIntroduce el nuevo valor de la posición " + posicion + ": ");                         
        n = sc.nextDouble();

        valores[posicion] = n;
        
        System.out.println("\nPosición a modificar " + posicion);
        System.out.println("Nuevo valor: " + n);
        System.out.println("Contenido del array modificado:");
        for (int i = 0; i < valores.length; i++) {
            System.out.printf("%.2f ", valores[i]);
        }

    }
}
Solución:
public class Excepciones3 {

    static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        double n = 0;
        int posicion = 0;
        String cadena = "";
        boolean repetir;
        double[] valores = {9.83, 4.5, -3.06, 0.06, 2.52, -11.3, 7.60, 3.00, -30.4, 105.2};                       

        System.out.println("Contenido del array antes de modificar:");
        for (int i = 0; i < valores.length; i++) {
            System.out.printf("%.2f ", valores[i]);
        }

        do {
            repetir = false;
            try {
                System.out.print("\n\nIntroduce la posición del array a modificar: ");
                cadena = sc.nextLine();
                posicion = Integer.parseInt(cadena);

                System.out.print("\nIntroduce el nuevo valor de la posición " + posicion + ": ");                 
                n = sc.nextDouble();

                valores[posicion] = n;
            }catch (InputMismatchException e) {
                System.err.println("Valor no válido");
                repetir = true;
                sc.nextLine();
            }catch (NumberFormatException e) {
                System.err.println("Valor no válido");
                repetir = true;
            } catch (Exception e) {
                System.err.println(e.toString());
                repetir = true;
            }           
        } while (repetir);

        System.out.println("\nPosición a modificar " + posicion);
        System.out.println("Nuevo valor: " + n);
        System.out.println("Contenido del array modificado:");
        for (int i = 0; i < valores.length; i++) {
            System.out.printf("%.2f", valores[i]);
        }
    }

}

9 comentarios:

  1. Realiza un programa en Java que realice mediante un método la suma de los valores de una fecha pedida por teclado. Por ejemplo: 11/05/2020 dará como resultado: 11+5+2020=2036.

    ResponderEliminar
  2. Crear un programa en Java que pida un número por teclado y que imprima por pantalla los números desde el número que se introdujo por teclado hasta 100 con salto de dos en dos.

    ResponderEliminar
  3. Implementa la clase trabajador que tiene las siguientes propiedades:
    Nombre del trabajador, DNI, Nº Seguridad Social, casado (true si está casado), horas extras, precio-hora-extra y sueldo.
    Y los siguientes métodos:
    Mostrar-datos: muestra todos los datos del trabajador
    Calcula-suedo-total: sueldo base +horas extras.
    Implementa la clase prueba-trabajador que muestre los datos de dos trabajadores y calcule el sueldo total
    ayuda para probar asignatura

    ResponderEliminar
  4. me podrian ayudar porfavor
    Elaborar un programa que me permita ingresar el nombre, el peso y sexo de n personas, y
    obtenga como resultado el promedio de peso que tienen los hombres y las mujeres.

    ResponderEliminar
  5. Hola gracias, por el ejemplo tan explicito sobre las excepciones, cuando leí sobre ellas no le encontraba un uso lo suficientemente útil y claro sobre estas. Sobre todo a la hora de implementar los bloques try, que sentencias pueden ir dentro. Porque me pasaba que las sentencias se perdían o todo lo que le pedía al programa que hiciera si lo hacia dentro de un try, pues no sucedía nada. Pero con esto logre entender de como usarlas. Ahora se me genera una incógnita el uso de throws en la cabecera del método, indica que tipo de excepciones podrá levantar dicho método (no sé, si tengo una mala interpretación sobre este concepto), por ende no lo utilizaste señalando que se lanzaría la excepción del tipo InputMismatchException ya que la excepción se dio en ese mismo método y la manejaste e hiciste su captura de una vez no?. Y una ultima pregunta porque sucede que al obviar el llamado al método nextLine() en algunos de los bloques catch de las primeras soluciones, la ejecución cae en un bucle sin poder finalizar en donde aparece, por ejemplo que se "introduzca el primer numero:" y se escribe el aviso impreso por pantalla de valor no valido y como este es del tipo cadena salta la sentencia de nuevo y así, no se supone que cuando seda el salto de linea por el println de "System.out.println("Valor no válido" + e.toString())" no deberia suceder esto? Gracias y espero haberme dado a entender con mis preguntas

    ResponderEliminar
  6. puede realizar esto
    Crear un programa que permita el ingreso de un valor y muestre dibujado con * un
    cuadrado. (no usar estructura de control como arreglo, lista, etc.) (10 pts.)
    Ejemplo:
    Ingrese valor: 4
    Salida:
    * * * *
    * * * *
    * * * *
    * * * *

    ResponderEliminar
  7. si pudieran realizar este ejercicio porfa ;c

    Crear un menú con las siguientes opciones: (8 pts.)
    Opción 1: leer 20 números y entregue la suma de los números pares y por otro lado
    entregue la suma de los números impares que se ingresaron. (10 pts.)
    ejemplo: si se ingresa 6- 1- 3- 0- 5- 7- 6- 4- 8- 6 -10- 3- 5- 10- 6- 12- 2- 30- 17- 31
    debe mostrar la suma de pares= 100, la suma de impares = 72
    Opción 2: Leer varias palabras y que se detenga al leer FIN, y muestre todas las palabras
    que se leyeron. (10 pts.)
    Opción 3: Leer 30 palabras y mostrar cuantas veces esta una determinada palabra. La
    palabra a buscar debe leerse antes de ingresar las 30 palabras. (10 pts.)
    Opción 4: Leer 2 números. El primero debe estar entre 5 y 50 y el segundo no debe ser par.
    Entregar como resultado la suma de los dos números, en caso de que sean correctos los
    valores, en caso contrario mostrar un mensaje de error. (10 pts.)
    numero1=5 y número 2=6 salida= ERROR (el segundo número es par)
    numero 1= 60 y número 2=7 salida= ERROR (número 1 no está entre 5 y 50)
    número 1=15 y número 2= 77 salida= 92

    ResponderEliminar
  8. Escribe un programa java que permita calcular el area de un tringulo, la lectura de base y altura sera por teclado usando Scanner, considere que el usuario podria ingresar de forma errada los datos como letras, espacios en blanco, simboles especiales. Para evitar errores debe agregar a su programa el manejo de excepciones try, catch y finally visto en clase, considere todas las posibilidades de fallo.

    ResponderEliminar
  9. Desarrollar el siguiente taller sobre manejo de excepciones y colecciones.

    ¿Qué pasaría si se intenta abrir un archivo para escritura, pero el archivo (o dispositivo) está protegido contra escritura? Desarrolle un programa en java para realizar esta prueba.

    ResponderEliminar