Excepciones comprobadas y no comprobadas¶
Hay dos tipos de excepciones:
- Excepciones comprobadas o capturadas (checked) son aquellas que estamos obligados a tratar. Son todas las clases derivadas de la clase
Exceptionexcepto las derivadas deRuntimeException. No son culpa del programador de Java. Por ejemplo, un programa que debe acceder a una imagen en una carpeta. Si esa imagen no se encuentra en la ubicación esperada porque alguien la ha movido, borrado o cambiado el nombre, dará error, no siendo responsabilidad del programador. - Excepciones no comprobadas o no capturadas (unchecked) son aquellas que no estamos obligados a tratar. Pertenecen a la clase
Errory a sus clases derivadas, y a la claseRuntimeExceptiony sus derivadas. Son responsabilidad del programador. Está en nuestra mano solventarlas mejorando el código. Por ejemplo, serían excepciones no comprobadas: recorrer un array con más posiciones de las declaradas, o intentar almacenar en una variable de tipo String un dato de tipo entero, etc.
El compilador Java obliga a declarar o capturar las excepciones comprobadas. El compilador muestra un mensaje de error si no se tratan o no se declara que son lanzadas de forma explícita.
Declarar excepciones¶
La declaración de las excepciones que puede lanzar un método se realiza escribiendo la palabra throws seguida del nombre de las excepciones separadas por comas. Por ejemplo, la instrucción System.in.read() para leer un carácter lanza una excepción de tipo IOException que debemos capturar o declarar.
/*En este ejemplo no se captura la excepción por lo que
estamos obligados a declararla*/
public static void main(String[] args) throws IOException{
char car;
System.out.println("Introduce un carácter");
car = (char)System.in.read();
}
La declaración de excepciones permite escribir métodos que no capturan las excepciones marcadas que se puedan producir. Una excepción no capturada se lanza para que la trate algún método de la pila de llamadas.
Lanzar excepciones¶
Java permite al programador lanzar excepciones mediante la palabra reservada throw:
throw objetoExcepcion;
La excepción que se lanza es un objeto, por lo que hay que crearlo como cualquier otro objeto mediante new.
if (n==0) throw new ArithmeticException(“División por cero”);
throw para lanzar un tipo de excepción comprobada o marcada, debe indicarse en su declaración con la cláusula throws.
Relanzar excepciones¶
Si se ha capturado una excepción es posible relanzar desde el bloque catch la excepción (el mismo objeto recibido en el bloque catch) utilizando la instrucción throw objetoExcepcion.
Crear nuestras propias excepciones¶
Aunque Java proporciona una gran cantidad de excepciones, en algunas ocasiones necesitaremos crear excepciones propias. Las excepciones propias
deben ser subclases de la clase Exception. Normalmente crearemos excepciones propias cuando queramos manejar excepciones no contempladas por la librería estándar de Java.
Por ejemplo, vamos a crear un tipo de excepción llamada ValorNoVálido que se lanzará cuando el valor utilizado en una determinada operación no sea correcto.
public class ValorNoValido extends Exception{
public ValorNoValido(){ }
public ValorNoValido(String cadena) {
super(cadena); //Llama al constructor de Exception y le pasa
// el contenido de cadena
}
}
public static void main(String[] args) {
try {
double x = leerValor();
System.out.println("Raíz cuadrada de " + x + " = " + Math.sqrt(x));
} catch (ValorNoValido e) {
System.out.println(e.getMessage());
}
}
public static double leerValor() throws ValorNoValido {
Scanner sc = new Scanner(System.in);
System.out.print("Introduce número > 0 ");
double n = sc.nextDouble();
if (n <= 0) {
throw new ValorNoValido("El número debe ser positivo");
}
return n;
}