Buenas, ¿qué hay? Las capturas de
varias excepciones se producen cuando tenemos un método que puede lanzar
excepciones de varios tipos.
Para ver esto vamos a trabajar con el
siguiente archivo:
package er;
import javax.swing.JOptionPane;
public class
Varias_Excepciones {
public static void main(String[] args) {
division();
}
static void division() {
int num1=Integer.parseInt(JOptionPane.showInputDialog("Introduce
el dividendo"));
int num2=Integer.parseInt(JOptionPane.showInputDialog("Introduce
el divisor"));
System.out.println("El
resultado es "+(num1/num2));
}
}
Es una aplicación muy sencilla que realiza el cálculo de una división, si lo probamos, introducimos el dividendo:
Introducimos el divisor:
Nos da el resultado de la división:
Pero si en el dividendo introducimos un 9 y en el divisor un 0 en consola nos aparece el siguiente error:
Sin embargo, si en lugar de introducir un 0 introducimos texto ya sea cuando nos solicita el divisor o el dividendo nos da otro error:
Si vamos a la API de Java
veremos que la clase ArithmeticException
hereda de RuntimeException, es una
excepción no controlada y no es necesario declarar la estructura try.. catch, al igual que la clase NumberFormatException.
La solución vendría declarando un try… catch en la llamada del método no
es recomendable hacerlo así porque los tipos de excepción que dan heredan como
ya se ha comentado en el párrafo anterior de RuntimeException no es un error controlado pero para que veáis la
sintaxis más adelante veremos cómo hacerlo de otra forma.
Entonces en la llamada al método
creamos el bloque try… catch:
try {
division();
}catch(Exception e) {
System.out.println("Ha
ocurrido un error");
}
Si al ejecutar el programa introducimos un cero o texto el error que nos va a aparecer en consola es el siguiente:
No nos daría ningún detalle acerca del
error, no sabes porque se ha producido. Si en lugar de introducir como
parámetro en el catch la clase Exception introducimos la clase que se
lanza al producirse un error:
try {
division();
}catch(ArithmeticException e) {
System.out.println("Error.
Estas dividiendo por 0");
}
Creamos otro catch a continuación para
la clase NumberFormatException:
try {
division();
}catch(ArithmeticException e) {
System.out.println("Error.
Estas dividiendo por 0");
}catch(NumberFormatException
e) {
System.out.println("Error.
Has introducido texto");
}
Si probamos, vamos a introducir primero un 0:
Si volvemos a ejecutar el programa introduciendo texto:
Cuando hay varios catch o cuando queremos que sea el error más explícito se utilizan
tres métodos:
·
getMessage()
·
getClass()
·
getName()
Vamos a probar el primer método de la
siguiente forma:
try {
division();
}catch(ArithmeticException e) {
System.out.println("Error.
Estas dividiendo por 0");
}catch(NumberFormatException
e) {
System.out.println("Error.
Has introducido texto");
System.out.println(e.getMessage());
}
Si ejecutamos la aplicación, introducimos texto:
Lo que nos ha capturado este método es
el texto que hemos introducido en el campo de texto.
Probamos los otros dos métodos:
try {
division();
}catch(ArithmeticException e) {
System.out.println("Error.
Estas dividiendo por 0");
}catch(NumberFormatException
e) {
System.out.println("Error.
Has introducido texto");
//System.out.println(e.getMessage());
System.out.println("Se ha generado un error de este tipo: "+e.getClass().getName());
}
Y en la consola:
Te da el tipo de error.
Tenéis ejercicios para practicar las
diferentes excepciones en el menú Ejercicios, os espero en el próximo post que
será el último del bloque de las excepciones. Saludos!
10.6 CREACIÓN DE EXCEPCIONES PROPIAS <<
>> 10.8 CLÁUSULA FINALLY
No hay comentarios:
Publicar un comentario