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
Exception
excepto 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
Error
y a sus clases derivadas, y a la claseRuntimeException
y 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;
}
Actividad¶
- AC 807 (RA3 / CE3g CE3h / IC1 / 3p). Escribe una excepción personalizada SetOverflow que se lanza en el método de inserción cuando el array está lleno. Escribe un bloque try/catch en el código de prueba para probar la excepción.