Listado completo de tutoriales

82 - Excepciones - múltiples catch para un try


Podemos definir varios bloques catch para un solo bloque try. Es común que en un bloque try haya más de un método que pueda elevar excepciones o inclusive un mismo método puede generar más de un tipo de excepción.

Luego podemos disponer una sintaxis de try/catch:

try {
  [instrucciones 1]
} catch([excepción 1]) {
  [instrucciones 2]
}
catch([excepción 2]) {
  [instrucciones 3]
}
catch([excepción n]) {
  [instrucciones n]
}

Problema:

Realizar la carga de 2 enteros por teclado, mostrar el resultado de dividir el primero por el segundo.

Programa:

import java.util.InputMismatchException;
import java.util.Scanner;

public class DivisionEnteros {
    public static void main(String[] ar) {
        Scanner teclado = new Scanner(System.in);
        try {
            int num1, num2;
            System.out.print("Ingrese primer valor entero (dividendo):");
            num1 = teclado.nextInt();
            System.out.print("Ingrese segundo valor entero (divisor):");
            num2 = teclado.nextInt();
            int resu = num1 / num2;
            System.out.print("La división de " + num1 + " / " + num2 + " es " + resu);
        } catch (InputMismatchException ex) {
            System.out.println("Debe ingresar obligatoriamente números enteros");
        } catch (ArithmeticException ex) {
            System.out.println("No se puede dividir por cero");
        }
    }
}

El bloque try implementa la captura de la excepción 'InputMismatchException' que puede suceder en cualquiera de las dos llamadas al método 'nextInt' de la clase Scanner.
También implementa la captura de la excepción 'ArithmeticException' que sucede si en la línea siguiente la variable num2 almacena un cero:

            int resu = num1 / num2;

Problema:

Confeccionar una aplicación visual que permita ingresar en controles de tipo JTextField dos valores enteros. Al presionar un botón mostrar la división del primero respecto al segundo en el título del JFrame o un mensaje si no se ingresan datos o la división no se puede efectuar.

Programa:

import javax.swing.*;
import java.awt.event.*;

public class Formulario extends JFrame implements ActionListener {
    private JTextField textfield1, textfield2;
    private JButton boton1;

    public Formulario() {
        setLayout(null);
        textfield1 = new JTextField();
        textfield1.setBounds(120, 10, 150, 20);
        add(textfield1);
        textfield2 = new JTextField();
        textfield2.setBounds(120, 40, 150, 20);
        add(textfield2);

        boton1 = new JButton("Dividir");
        boton1.setBounds(10, 80, 100, 30);
        add(boton1);
        boton1.addActionListener(this);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == boton1) {
            String cad1 = textfield1.getText();
            String cad2 = textfield2.getText();
            try {
                int valor1 = Integer.parseInt(cad1);
                int valor2 = Integer.parseInt(cad2);
                int resultado = valor1 / valor2;
                setTitle("La división de " + cad1 + " con respecto a " + cad2 + " es " + resultado);
            } catch (NumberFormatException ex) {
                setTitle("Debe ingresar números enteros.");
            } catch (ArithmeticException ex) {
                setTitle("No se puede dividir por cero.");
            }
        }
    }

    public static void main(String[] ar) {
        Formulario formulario1 = new Formulario();
        formulario1.setBounds(0, 0, 450, 170);
        formulario1.setDefaultCloseOperation(EXIT_ON_CLOSE);
        formulario1.setVisible(true);
    }
}

Cuando se presiona el botón en el método actionPerformed recuperamos los dos datos ingresados en los controles JTextField:

            String cad1 = textfield1.getText();
            String cad2 = textfield2.getText();

Abrimos un bloque try donde verificaremos excepciones de tipo 'NumberFormatException' que son disparadas por el método estático 'parseInt' de la clase Integer. Esto sucede si el String no contiene un valor entero.

De forma similar al problema anterior capturamos si hay una excepción de intentar la división por cero:

            try {
                int valor1 = Integer.parseInt(cad1);
                int valor2 = Integer.parseInt(cad2);
                int resultado = valor1 / valor2;
                setTitle("La división de " + cad1 + " con respecto a " + 
                  cad2 + " es " + resultado);
            } catch (NumberFormatException ex) {
                setTitle("Debe ingresar números enteros.");
            } catch (ArithmeticException ex) {
                setTitle("No se puede dividir por cero.");
            }

Si ejecutamos la aplicación e ingresamos en alguno de los dos controles de tipo JTextField valores que no sean numéricos, al presionar el botón se nos informa del problema en lugar de detenerse el programa con una excepción:

Java excepciones captura

De forma similar se dispara la excepción ArithmeticException si ingresamos el el segundo JTextField el valor cero.

El bloque catch requiere en forma obligatoria las llaves de apertura y cerrado independientemente ha que tenga 1 instrucción.

            } catch (NumberFormatException ex) {
                setTitle("Debe ingresar números enteros.");
            } catch (ArithmeticException ex) {
                setTitle("No se puede dividir por cero.");
            }

Problema:

Declarar un vector de 10 elementos enteros. Permitir que el usuario ingrese un subíndice del vector y nos muestre el contenido de dicha componente. Atrapar las excepciones de fuera de rango del vector y si ingresa un valor no entero.

Programa:

import java.util.InputMismatchException;
import java.util.Scanner;

public class ConsultaVector {

    public static void main(String[] ar) {
        int[] vec = { 20, 45, 76, 81, 34, 567, 423, 6, 3, 5 };
        Scanner teclado = new Scanner(System.in);
        int indice;
        try {
            System.out.print("Ingrese un valor entre 0 y 9:");
            indice = teclado.nextInt();
            System.out.print("En el vector se almacena en la posición " + indice + " el valor " + vec[indice]);
        } catch (InputMismatchException ex) {
            System.out.println("Debe ingresar obligatoriamente número entero");
        } catch (IndexOutOfBoundsException ex) {
            System.out.println("El valor debe estar entre 0 y 9");

        }
    }
}

La excepción 'IndexOutOfBoundsException' se dispara cuando intentamos acceder a una componente inexistente de un vector (por ejemplo ingresamos un 15 en la variable 'indice'):

            System.out.print("En el vector se almacena en la posición " +
              indice + " el valor " + vec[indice]);

Retornar