Excepciones - LSUBlsub.org/ist/2.excepciones.pdf · Excepciones • Gestión de errores para casos...

21
Excepciones LSUB, GSYC, URJC 1 Monday, February 4, 13

Transcript of Excepciones - LSUBlsub.org/ist/2.excepciones.pdf · Excepciones • Gestión de errores para casos...

Page 1: Excepciones - LSUBlsub.org/ist/2.excepciones.pdf · Excepciones • Gestión de errores para casos excepcionales • Parte del interfaz de una clase • Clases en sí mismas Monday,

ExcepcionesLSUB, GSYC, URJC

1Monday, February 4, 13

Page 2: Excepciones - LSUBlsub.org/ist/2.excepciones.pdf · Excepciones • Gestión de errores para casos excepcionales • Parte del interfaz de una clase • Clases en sí mismas Monday,

Excepciones

• Gestión de errores para casos excepcionales

• Parte del interfaz de una clase

• Clases en sí mismas

2Monday, February 4, 13

Page 3: Excepciones - LSUBlsub.org/ist/2.excepciones.pdf · Excepciones • Gestión de errores para casos excepcionales • Parte del interfaz de una clase • Clases en sí mismas Monday,

Excepciones

main

f()

g()

Pila

g()

maneja excepciones

3Monday, February 4, 13

Page 4: Excepciones - LSUBlsub.org/ist/2.excepciones.pdf · Excepciones • Gestión de errores para casos excepcionales • Parte del interfaz de una clase • Clases en sí mismas Monday,

Excepciones

main

f()

g()

Pila

g()

manejador excepciones

Excepción

4Monday, February 4, 13

Page 5: Excepciones - LSUBlsub.org/ist/2.excepciones.pdf · Excepciones • Gestión de errores para casos excepcionales • Parte del interfaz de una clase • Clases en sí mismas Monday,

Excepciones

• El manejador puede

• Elevar una nueva excepción

• Continuar normalmente

5Monday, February 4, 13

Page 6: Excepciones - LSUBlsub.org/ist/2.excepciones.pdf · Excepciones • Gestión de errores para casos excepcionales • Parte del interfaz de una clase • Clases en sí mismas Monday,

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

Page 7: Excepciones - LSUBlsub.org/ist/2.excepciones.pdf · Excepciones • Gestión de errores para casos excepcionales • Parte del interfaz de una clase • Clases en sí mismas Monday,

Excepciones

Oops: java.lang.RuntimeException: Bang!algo hecho

7Monday, February 4, 13

Page 8: Excepciones - LSUBlsub.org/ist/2.excepciones.pdf · Excepciones • Gestión de errores para casos excepcionales • Parte del interfaz de una clase • Clases en sí mismas Monday,

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

Page 9: Excepciones - LSUBlsub.org/ist/2.excepciones.pdf · Excepciones • Gestión de errores para casos excepcionales • Parte del interfaz de una clase • Clases en sí mismas Monday,

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

Page 10: Excepciones - LSUBlsub.org/ist/2.excepciones.pdf · Excepciones • Gestión de errores para casos excepcionales • Parte del interfaz de una clase • Clases en sí mismas Monday,

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

Page 11: Excepciones - LSUBlsub.org/ist/2.excepciones.pdf · Excepciones • Gestión de errores para casos excepcionales • Parte del interfaz de una clase • Clases en sí mismas Monday,

Excepciones en Java

•Todas derivan de Throwable

•Pero vamos a considerarlas todas excepciones

Throwable

Exception Error

RuntimeException

11Monday, February 4, 13

Page 12: Excepciones - LSUBlsub.org/ist/2.excepciones.pdf · Excepciones • Gestión de errores para casos excepcionales • Parte del interfaz de una clase • Clases en sí mismas Monday,

Excepciones

class HazException extends Exception { HazException(String s){ super(s); }};

12Monday, February 4, 13

Page 13: Excepciones - LSUBlsub.org/ist/2.excepciones.pdf · Excepciones • Gestión de errores para casos excepcionales • Parte del interfaz de una clase • Clases en sí mismas Monday,

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

Page 14: Excepciones - LSUBlsub.org/ist/2.excepciones.pdf · Excepciones • Gestión de errores para casos excepcionales • Parte del interfaz de una clase • Clases en sí mismas Monday,

Excepciones

algo hechoHaz ex:ex.HazException: Bang!

14Monday, February 4, 13

Page 15: Excepciones - LSUBlsub.org/ist/2.excepciones.pdf · Excepciones • Gestión de errores para casos excepcionales • Parte del interfaz de una clase • Clases en sí mismas Monday,

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

Page 16: Excepciones - LSUBlsub.org/ist/2.excepciones.pdf · Excepciones • Gestión de errores para casos excepcionales • Parte del interfaz de una clase • Clases en sí mismas Monday,

Excepciones

• RuntimeException:

• Arithmetic Exception

• NullPointer Exception

• IndexOutOfBounds Exception

• ...

16Monday, February 4, 13

Page 17: Excepciones - LSUBlsub.org/ist/2.excepciones.pdf · Excepciones • Gestión de errores para casos excepcionales • Parte del interfaz de una clase • Clases en sí mismas Monday,

Excepciones

• Error:

• IOError

• AssertionError

• ...

Nota: deriva de Throwable, no de Exception.

17Monday, February 4, 13

Page 18: Excepciones - LSUBlsub.org/ist/2.excepciones.pdf · Excepciones • Gestión de errores para casos excepcionales • Parte del interfaz de una clase • Clases en sí mismas Monday,

Excepciones

• Podemos imprimir la pila

• Y podemos ejecutar código incondicionalmente tengamos excepciones o no (finally).

18Monday, February 4, 13

Page 19: Excepciones - LSUBlsub.org/ist/2.excepciones.pdf · Excepciones • Gestión de errores para casos excepcionales • Parte del interfaz de una clase • Clases en sí mismas Monday,

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

Page 20: Excepciones - LSUBlsub.org/ist/2.excepciones.pdf · Excepciones • Gestión de errores para casos excepcionales • Parte del interfaz de una clase • Clases en sí mismas Monday,

Excepciones

• O podemos usar recursos cuyo ámbito es un try....

20Monday, February 4, 13

Page 21: Excepciones - LSUBlsub.org/ist/2.excepciones.pdf · Excepciones • Gestión de errores para casos excepcionales • Parte del interfaz de una clase • Clases en sí mismas Monday,

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