Excepciones LSUB, GSYC, URJC Monday, February 4, 13 1 Excepciones • Gestión de errores para casos excepcionales • Parte del interfaz de una clase • Clases en sí mismas Monday, February 4, 13 2 Excepciones g() g() f() maneja excepciones main Pila Monday, February 4, 13 3 Excepciones g() Excepción g() f() manejador excepciones main Pila Monday, February 4, 13 4 Excepciones • El manejador puede • Elevar una nueva excepción • Continuar normalmente Monday, February 4, 13 5 Excepciones public class Main { public static void hazOtraCosa() { throw new RuntimeException("Bang!"); } public static void hazAlgo() { try { hazOtraCosa(); System.out.println("otra cosa hecha"); }catch(Exception e) { System.err.println("Oops: " + e); } } public static void main(String args[]) { hazAlgo(); System.out.println("algo hecho"); } } Monday, February 4, 13 6 Excepciones Oops: java.lang.RuntimeException: Bang! algo hecho Monday, February 4, 13 7 Excepciones public class Main { public static void hazOtraCosa() { throw new RuntimeException("Bang!"); } public static void hazAlgo() { try { hazOtraCosa(); System.out.println("otra cosa hecha"); }catch(RuntimeException e) { System.err.println("Oops: " + e); throw e; } } public static void main(String args[]) { hazAlgo(); System.out.println("algo hecho"); } } Monday, February 4, 13 8 Excepciones Oops: java.lang.RuntimeException: Bang! Exception in thread "main" java.lang.RuntimeException: Bang! at ex.Main.hazOtraCosa(Main.java:6) at ex.Main.hazAlgo(Main.java:11) at ex.Main.main(Main.java:20) Monday, February 4, 13 9 Excepciones en Java • Monday, February 4, 13 Tres tipos: • Exception: cualquier situación excepcional en nuestro programa de la que nos podamos recuperar. • • Error: errores en el sistema (e.g. IO error). RuntimeException: situaciones internas al programa de las que puede que no nos podamos recuperar (e.g. un bug). 10 Excepciones en Java •Todas derivan de Throwable •Pero vamos a considerarlas todas excepciones Throwable Exception Error RuntimeException Monday, February 4, 13 11 Excepciones class HazException extends Exception { HazException(String s){ super(s); } }; Monday, February 4, 13 12 Excepciones Monday, February 4, 13 public static void hazOtraCosa() throws HazException { throw new HazException("Bang!"); } public static void hazAlgo() { try { hazOtraCosa(); System.out.println("otra cosa hecha"); }catch(RuntimeException e) { System.err.println("RT: " + e); }catch(Error e) { System.err.println("Err: " + e); }catch(HazException e) { System.err.println("Haz ex:" + e); } } 13 Excepciones algo hecho Haz ex:ex.HazException: Bang! Monday, February 4, 13 14 Excepciones en Java Exception: • La excepción forma parte de la interfaz pública del método: los métodos tienen que especificar las excepciones que pueden levantar (throws) • • El compilador obliga a manejar la excepción Se denominan “checked exceptions” Error y RuntimeException: • El compilador no obliga a manejar estas excepciones (aunque las podemos/ debemos manejar) • • No forman parte de la interfaz pública del método que las puede provocar Monday, February 4, 13 Se denominan “unchecked exceptions” 15 Excepciones • RuntimeException: • Arithmetic Exception • NullPointer Exception • IndexOutOfBounds Exception • ... Monday, February 4, 13 16 Excepciones • Error: • IOError • AssertionError • ... Nota: deriva de Throwable, no de Exception. Monday, February 4, 13 17 Excepciones • Podemos imprimir la pila • Y podemos ejecutar código incondicionalmente tengamos excepciones o no (finally). Monday, February 4, 13 18 Excepciones Monday, February 4, 13 InputStream s = null; try { s = new FileInputStream("README"); }catch(FileNotFoundException e) { e.printStackTrace(); System.exit(1); } try { int b = s.read(); }catch(IOException e) { System.err.println("couldn't read: " + e); }finally { s.close(); } 19 Excepciones • O podemos usar recursos cuyo ámbito es un try.... Monday, February 4, 13 20 Excepciones try(InputStream s = new FileInputStream("README")) { int b = s.read(); } • Se llama a s.close() al final • Suframos excepciones o no • Ha de implementar AutoCloseable • Disponible a partir de Java SE 7 Monday, February 4, 13 21