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:

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:

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:

No hay comentarios:
Publicar un comentario