Tema 5. Excepciones Exception Excepciones estándar Capturar una Exception Crear nuevas excepciones Lanzar una Exception 1 Exception Java incorpora en el lenguaje la gestión de errores Exception: error o condición anormal producida durante la ejecución del programa Excepciones fatales: se debe finalizar la ejecución del programa Excepciones recuperables: se debe dar la oportunidad de corregir el error Formas de gestionar los errores: Método tradicional: comprobando códigos de error que devuelven los métodos Soporte del lenguaje: el lenguaje proporciona construcciones especiales 2 Excepciones estándar (i) Los errores se representan mediante dos tipos de clases derivadas de la clase Throwable: Error y Exception Clase Error: Relacionada con errores de compilación, del sistema o de la JVM → son irrecuperables Clase Exception: RuntimeException: Excepciones frecuentes (implícitas). El propio lenguaje chequea y lanza las excepciones que derivan de esta clase Ej: recibir una referencia null en un método Ej: sobrepasar el tamaño de un array Resto de clases derivadas: Excepciones explícitas. Deben gestionarse por el programador 3 Excepciones estándar (ii) Por heredar de Throwable, todos los tipos de excepciones pueden usar los métodos: String getMessage() → Devuelve el mensaje de error asociado a la excepción String toString() → Devuelve una breve descripción del objeto void printStackTrace() → Imprime una traza de la pila java.lang.NullPointerException at MyClass.mash(MyClass.java:9) at MyClass.crunch(MyClass.java:6) at MyClass.main(MyClass.java:3) 4 Capturar una Exception Si en un método se produce una Exception, el programa no compilará mientras no se haga una de estas cosas: Gestionar la excepción con una construcción del tipo try/catch/finally Relanzar la excepción hacia un método anterior en la pila, utilizando la construcción throws en la cabecera del método El compilador obliga a capturar las excepciones explícitas 5 Bloque try/catch/finally Ejemplo: try { // código a vigilar } catch (IOException e1) { System.out.println(e1.getMessage()); } catch (MiExcepcion e2) { System.out.println(e2.getMessage()); } finally{ } El código dentro de try está vigilado. Si se produce una excepción se irá al bloque catch correspondiente. El bloque finally es opcional. Si se incluye se ejecuta siempre, haya o no excepción, incluso si hay un return en el bloque try 6 Relanzar una Exception Si no se desea gestionar en un método una Exception, se puede relanzar la excepción al método desde el que fue llamado Hay que añadir a la cabecera del método: throws + nombre de la Exception Ejemplo: void metodo1() throws IOException, MiExcepcion Si metodo2 llama a metodo1, tiene 2 opciones: Capturar las excepciones de metodo1 y gestionarlas Desentenderse y remitirlas a otro método anterior en la pila para gestionarlas 7 Crear nuevas excepciones Deben derivar de la clase Exception o de una clase derivada Suelen tener 2 constructores: Constructor sin argumentos Constructor con un String como argumento. El String suele definir el mensaje de error. Conviene que los constructores llamen al constructor de la clase base (super) Ejemplo: class MiExcepcion extends Exception { public MiExcepcion(){ super(); } public MiExcepcion(String s){ super(s);} } 8 Lanzar una Exception Proceso de lanzamiento: Crear un objeto Exception de la clase adecuada Lanzar la excepción con la sentencia throw seguida del objeto creado Ejemplo: MiExcepcion miExc = new MiExcepcion(“Mensaje”); throw miExc; Al lanzar la excepción el método termina de inmediato sin devolver ningún valor Sólo si el método incluye los bloques try/catch/finally se ejecutará el bloque catch o el finally 9