ExcepcionesLSUB, GSYC, URJC
1Monday, February 4, 13
Excepciones
• Gestión de errores para casos excepcionales
• Parte del interfaz de una clase
• Clases en sí mismas
2Monday, February 4, 13
Excepciones
main
f()
g()
Pila
g()
maneja excepciones
3Monday, February 4, 13
Excepciones
main
f()
g()
Pila
g()
manejador excepciones
Excepción
4Monday, February 4, 13
Excepciones
• El manejador puede
• Elevar una nueva excepción
• Continuar normalmente
5Monday, February 4, 13
Excepcionespublic 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"); }}
6Monday, February 4, 13
Excepciones
Oops: java.lang.RuntimeException: Bang!algo hecho
7Monday, February 4, 13
Excepcionespublic 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"); }}
8Monday, February 4, 13
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)
9Monday, February 4, 13
Excepciones en Java
• 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).
10Monday, February 4, 13
Excepciones en Java
•Todas derivan de Throwable
•Pero vamos a considerarlas todas excepciones
Throwable
Exception Error
RuntimeException
11Monday, February 4, 13
Excepciones
class HazException extends Exception { HazException(String s){ super(s); }};
12Monday, February 4, 13
Excepciones 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); } }
13Monday, February 4, 13
Excepciones
algo hechoHaz ex:ex.HazException: Bang!
14Monday, February 4, 13
Excepciones en JavaException:
• 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
• Se denominan “unchecked exceptions”
15Monday, February 4, 13
Excepciones
• RuntimeException:
• Arithmetic Exception
• NullPointer Exception
• IndexOutOfBounds Exception
• ...
16Monday, February 4, 13
Excepciones
• Error:
• IOError
• AssertionError
• ...
Nota: deriva de Throwable, no de Exception.
17Monday, February 4, 13
Excepciones
• Podemos imprimir la pila
• Y podemos ejecutar código incondicionalmente tengamos excepciones o no (finally).
18Monday, February 4, 13
Excepciones 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(); }
19Monday, February 4, 13
Excepciones
• O podemos usar recursos cuyo ámbito es un try....
20Monday, February 4, 13
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
21Monday, February 4, 13