miƩrcoles, 11 de mayo de 2022

81 - Excepciones en Java - try/catch

 Java dispone de un mecanismo de capturar (catch) ciertos tipos de errores que solo pueden ser detectados en tiempo de ejecuciĆ³n del programa.



Los ejemplos mƔs comunes que podemos nombrar de excepciones:

  • Tratar de convertir a entero un String que no contiene valores numĆ©ricos.
  • Tratar de dividir por cero.
  • Abrir un archivo de texto inexistente o que se encuentra bloqueado por otra aplicaciĆ³n.
  • Conectar con un servidor de bases de datos que no se encuentra activo.
  • Acceder a subĆ­ndices de vectores y matrices fuera de rango.

La captura de excepciones nos permite crear programas mucho mĆ”s robustos y tolerante a fallas que ocurren en escasas situaciones, pero en caso que se presenten disponemos de un algoritmo alternativo para reaccionar a dicha situaciĆ³n evitando que el programa finalice su ejecuciĆ³n.

Veremos un ejemplo sin captura de excepciones y luego la sintaxis implementando su captura.

Problema:

Realizar la carga de un nĆŗmero entero por teclado e imprimir su cuadrado.

Programa:

import java.util.Scanner;

public class CuadradoNumero {
public static void main(String[] ar) {
Scanner teclado = new Scanner(System.in);
int num;
System.out.print("Ingrese un valor entero:");
num = teclado.nextInt();
int cuadrado = num * num;
System.out.print("El cuadrado de " + num + " es " + cuadrado);
}
}

Si ejecutamos el programa y el operador ingresa un String en lugar de un entero se genera una excepciĆ³n y el programa se detiene en forma inmediata:

Java excepciones sin capturar

El programa no ejecuta mĆ”s instrucciones despuĆ©s de la lĆ­nea 8 del mĆ©todo main. Se informa el nombre de excepciĆ³n generada: java.util.InputMismatchException, es decir se nos informa el nombre de clase de excepciĆ³n y el paquete que la contiene: java.util

Lo primero que podemos decir es que Ć©ste tipo de excepciones no son obligatorias capturarlas, pero como vemos si nuestro usuario del programa en forma frecuente se equivoca y carga cadenas en lugar de enteros el programa se detiene y requiere que lo vuelva a ejecutar.

Podemos implementar un programa mĆ”s robusto si capturamos la excepciĆ³n InputMismatchException y le informamos al usuario que debe ingresar un entero obligatoriamente.

Veamos ahora la sintaxis del mismo programa pero capturando la excepciĆ³n:

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

public class CuadradoNumero {
public static void main(String[] ar) {
Scanner teclado = new Scanner(System.in);
int num;
try {
System.out.print("Ingrese un valor entero:");
num = teclado.nextInt();
int cuadrado = num * num;
System.out.print("El cuadrado de " + num + " es " + cuadrado);
} catch (InputMismatchException ex) {
System.out.println("Debe ingresar obligatoriamente un nĆŗmero entero.");
}
}
}

Para atrapar las excepciones debemos encerrar en un bloque try las instrucciones que generan excepciones, en nuestro caso el mƩtodo 'nextInt' de la clase Scanner:

        try {
System.out.print("Ingrese un valor entero:");
num = teclado.nextInt();
int cuadrado = num * num;
System.out.print("El cuadrado de " + num + " es " + cuadrado);
}

Todo bloque try requiere que sea seguido por un bloque catch:

        catch (InputMismatchException ex) {
System.out.println("Debe ingresar obligatoriamente un nĆŗmero entero.");
}

Luego de la palabra clave catch se indica entre parĆ©ntesis el nombre de un parĆ”metro cualquiera (en nuestro caso lo llamamos 'ex') y el nombre de la excepciĆ³n a capturar.

El bloque catch normalmente no se ejecuta salvo en los casos excepcionales que dentro del bloque try informa que se disparĆ³ dicha excepciĆ³n.

Ahora si ejecutamos el programa y el operador ingresa un String en lugar de un entero nuestro programa no se detiene sino se le informa el tipo de error que cometiĆ³ el usuario:

Java excepciones capturar

Cuando se dispara una excepciĆ³n las instrucciones que hay luego del mĆ©todo que la disparĆ³ no se ejecutan:

            num = teclado.nextInt();
int cuadrado = num * num;
System.out.print("El cuadrado de " + num + " es " + cuadrado);

La dos instrucciones luego de llamar al mĆ©todo 'nextInt' no se ejecutan si dicho mĆ©todo eleva la excepciĆ³n.

Podemos modificar ahora nuestro programa aun mƔs para que no finalice hasta que cargue un valor entero:

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

public class CuadradoNumero {
public static void main(String[] ar) {
Scanner teclado = new Scanner(System.in);
int num;
boolean continua;
do {
try {
continua = false;
System.out.print("Ingrese un valor entero:");
num = teclado.nextInt();
int cuadrado = num * num;
System.out.print("El cuadrado de " + num + " es " + cuadrado);
} catch (InputMismatchException ex) {
System.out.println("Debe ingresar obligatoriamente un nĆŗmero entero.");
teclado.next();
continua = true;
}
} while (continua);
}
}

Si ejecutamos esta variante de programa, el pedido de la carga del entero no finalizarĆ” hasta que lo ingrese:

Java excepciones capturar

No hay comentarios:

Publicar un comentario