Sunteți pe pagina 1din 35

1raLamlenLo de excepclones

1
ConLenldo
2
Soware LoleranLe a fallos
Ll concepLo de excepcln
CapLura y LraLamlenLo de excepclones
ropagacln de excepclones
Lxcepclones predenldas
uenlcln de nuevas excepclones
Ll concepLo de excepcln"
una !"#!$#%&' es un evenLo que lnLerrumpe el u[o
normal de lnsLrucclones duranLe la e[ecucln de un
programa.
Las apllcaclones pueden produclr muchas clases de
errores de dlversos nlveles de severldad:
un chero que no puede enconLrarse o no exlsLe,
un lndlce fuera de rango,
un enlace de red que falla,
un fallo en un dlsco duro,
...
3
La necesldad de LraLar los
errores
Conslderemos el (pseudo)cdlgo del slgulenLe meLodo que lee un chero y
copla su conLenldo en memorla.



leerFichero() {
abrir el fichero;
determinar la longitud del fichero;
reservar la memoria suficiente;
copiar el fichero en memoria;
cerrar el fichero;
}
4
Qu pasa si el fichero no puede abrirse?
Qu pasa si no puede
determinarse la longitud del
fichero?
Qu pasa si
no puede
reservarse
memoria
suficiente?
Qu pasa si
falla la lectura?
Qu pasa si el fichero no puede cerrarse?
1raLamlenLo clslco de errores
tipoDeCdigoDeError leerFichero {
tipoDeCdigoDeError cdigoDeError = 0;
abrir el fichero;
if (el fichero est abierto) {
determinar la longitud del fichero;
if (se consigue la longitud del fichero) {
reservar la memoria suficiente;
if (se consigue la memoria) {
copiar el fichero en memoria;
if (falla la lectura) { cdigoDeError = -1; }
} else { cdigoDeError = -2; }
} else { cdigoDeError = -3; }
cerrar el fichero;
if (el fichero no se cerr && cdigoDeError == 0){
cdigoDeError = -4;
} else { cdigoDeError = cdigoDeError and 4; }
} else { cdigoDeError = -5; }
return cdigoDeError ;
}
5
Difcil de leer
Se pierde el flujo lgico de ejecucin
Difcil de modificar
Ll LraLamlenLo de excepclones
leerFichero {
try {
abrir el fichero;
determinar la longitud del fichero;
reservar la memoria suficiente;
copiar el fichero en memoria;
cerrar el fichero;
} catch (fall la apertura del fichero) {
...;
} catch (fall el clculo de la longitud del fichero) {
...;
} catch (fall la reserva de memoria) {
...;
} catch (fall la lectura del fichero) {
...;
} catch (fall el cierre del fichero) {
...;
}
}
6
Las excepciones no nos liberan de hacer la
deteccin, de informar y de manejar los errores,
pero nos permiten escribir el flujo principal de
nuestro cdigo en un sitio y de tratar los casos
excepcionales separadamente.
Cue es una excepcln?
Cuando ocurre un error en un meLodo esLe crea un ob[eLo
excepcln ((') !"#!$#%&') y lo enLrega al slsLema de e[ecucln
(+)',) (') !"#!$#%&').
LsLe ob[eLo conuene lnformacln sobre el error, lncluldo su upo y
el esLado del programa donde ocurrl.
Ll slsLema de e[ecucln recorre la plla de llamadas buscando un
meLodo que conLenga un bloque de cdlgo que mane[e la
excepcln (-)'!.)/01 /! !"#!$#%&').

7
mtodo con manejador de la excepcin
main
mtodo sin manejador de la excepcin
mtodo donde ocurre el error
Llamadas
a mtodos
Bsqueda del
manejador
apropiado
unLos de vlsLa anLe las excepclones
Pay dos punLos de vlsLa para las excepclones:
!" $%& "'()' *&"&+' , -.,-'/'0 "' &12&-234(
Se encuenLra en una slLuacln que no sabe cmo (o
qulere) resolver y crea una excepcln y la lanza
Le llega la excepcln y no sabe que hacer con ella y la
propaga
!" $%& "' 5.'5' *2'-5%.'0 "' &12&-234(
Sabe cmo resolver una slLuacln que provoca una
excepcln y dlspone de un LraLamlenLo para ella.
un meLodo puede acLuar desde los dos punLos de vlsLa
CapLura unas excepclones y lanza oLras.
Las especlcaclones suelen lndlcar cmo acLuar.

8
La clase Throwable y sus subclases
9
... Format... Exception
Object
Error Exception
InterruptedException IOException RuntimeException
...
...
NullPointerException
IllegalArgumentException
IndexOutOfBoundsException
ArithmeticException
MalformedURLException
FileNotFoundException
ArrayIndexOutOfBoundsException
NumberFormatException
La clase Throwable
Slo ob[eLos que son lnsLanclas de la clase Throwable (o
de una de sus subclases) pueden ser lanzados por la !vM o
con una lnsLruccln throw, y slo esLos pueden ser
argumenLos de una clusula catch.
or convencln, la clase Throwable y sus subclases uenen
dos consLrucLores:
Sln argumenLos y
Con un argumenLo de upo String, el cual puede ser usado para
lndlcar mensa[es de error.
un ob[eLo de la clase Throwable conuene el esLado de la
plla de e[ecucln (de su 231!)/) en el momenLo en que fue
creado.
10
La clase Throwable (ll)
String getMessage()
uevuelve el LexLo con el mensa[e de error del ob[eLo.

void printStackTrace()
lmprlme esLe ob[eLo y su Lraza en la sallda de errores esLndar.


11
Lanzar una excepcln
una excepcln es una lnsLancla de una clase, que se crea con el
operador new.
ara lanzarla se uullza
throw <objeto-excepcin>
throw new RuntimeException(comentario adecuado);
LsLo lnLerrumpe el u[o de e[ecucln y se procede a la
busqueda de un mane[ador para esa excepcln, es declr,
algulen que la LraLe".

12
public Circulo(Punto p, double r) {
if (r < 0 ) {
throw new RuntimeException(Radio negativo);
}
radio = r;
centro = p;
}
Lanzar una excepcln
Ln la clase Recta del e[emplo prRecta
public Punto interseccionCon(Recta r) {
if (paralelaA(r)) {
throw new RuntimeException("Rectas paralelas");
}
...
}

13
}nos plden que devolvamos el corLe pero son paralelas!
Ln la clase Urna del proyecLo prUrna
public class Urna {
...
public ColorBola extraeBola() {
if (totalBolas() == 0) {
throw new RuntimeException(No hay bolas);
}
...
}
}

}nos plden una bola y no hay!
ropagacln de excepclones
una excepcln ser auLomucamenLe propagada sl no se LraLa

public int stringAInt(string str) {
return Integer.parseInt(str);
}
14
Sl str no es converuble a enLero se lanza una
NumberFormatException y se propaga
ropagacln de excepclones
Ln la clase TestUrna del proyecLo prUrna

public class TestUrna {
public static void main(String[] args) {
int bb = Integer.parseInt(args[0]);
int bn = Integer.parseInt(args[1]);
...
}
}
15
Sl args.length < 2 nos lanzan
ArrayIndexOutOfBoundsException y la propagamos
Sl args[0] o args[1] no son converubles a enLero se
lanza una NumberFormatException y la propagamos.
Lxcepuon ln Lhread "maln" [ava.lang.ArraylndexCuLCf8oundsLxcepuon: 0
aL 1esLurna.maln(1esLurna.[ava:4)
Lxcepuon ln Lhread "maln" [ava.lang.numberlormaLLxcepuon: lor lnpuL sLrlng: "2e"
aL [ava.lang.numberlormaLLxcepuon.forlnpuLSLrlng(numberlormaLLxcepuon.[ava:48)
aL [ava.lang.lnLeger.parselnL(lnLeger.[ava:438)
aL [ava.lang.lnLeger.parselnL(lnLeger.[ava:499)
aL 1esLurna.maln(1esLurna.[ava:3)

CapLura de excepclones
La lnsLruccln try-catch
vlgllan" bloques de cdlgo para capLurar las poslbles excepclones.
Las lnsLrucclones a vlgllar" se enclerran en bloques try.
Los mane[adores de excepclones se lncluyen en bloques catch
asoclados a esLos.
try {
...
} catch (63-,7&!12&-234( (,89.&) {
...
} catch (63-,7&!12&-234( (,89.&) {
...
} ...
un bloque catch es e[ecuLado cuando se lnvoca dlcho mane[ador,
es declr, cuando el bloque vlgllado" lanza la excepcln en
cuesun.

16
La capLura de excepclones
public class TestUrna {
public static void main(String[] args) {
try {
int bb = Integer.parseInt(args[0]);
int bn = Integer.parseInt(args[1]);
...
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Uso: TestUrna <Int> <Int>");
} catch (NumberFormatException ee) {
System.out.println("Los argumentos deben ser nmeros enteros");
}
}
}

Los mane[adores pueden hacer ms: pregunLar al usuarlo por la declsln a
Lomar, recuperarse del error o Lermlnar el programa.
1amblen podemos poner cada una de las lnsLrucclones que pueden lanzar
excepclones en bloques try dlferenLes y proporclonar mane[adores de
excepclones para cada uno.
17
Ll bloque finally
Ll bloque finally es opclonal, y su funcln es la de de[ar el
programa en un esLado correcLo lndependlenLemenLe de lo que
suceda denLro del bloque try (cerrar cheros, llberar
recursos, ...).
Ll bloque finally es e[ecuLado slempre.
18
Ll uso del bloque finally
public void escribeListaHasta(int top) {
PrintWriter out = null;
try {
out = new PrintWriter(new FileWriter("out.txt"));
for (int i = 0; i < top; i++) {
out.println("valor: " + i + " = " + v[i]);
}
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println(ndice fuera de rango);
} catch (IOException e) {
System.err.println("out.txt no puede abrirse");
} finally {
if (out != null) {
out.close();
}
}
}
19
1: Ccurre una excepcln IOException
public void escribeListaHasta(int top) {
PrintWriter out = null;
try {
out = new PrintWriter(new FileWriter("out.txt"));
for (int i = 0; i < top; i++) {
out.println("valor: " + i + " = " + v[i]);
}
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println(ndice fuera de rango);
} catch (IOException e) {
System.err.println("out.txt no puede abrirse");
} finally {
if (out != null) {
out.close();
}
}
}
20
2: Ccurre una excepcln
ArrayIndexOutOfBoundsException
public void escribeListaHasta(int top) {
PrintWriter out = null;
try {
out = new PrintWriter(new FileWriter("out.txt"));
for (int i = 0; i < top; i++) {
out.println("valor: " + i + " = " + v[i]);
}
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println(ndice fuera de rango);
} catch (IOException e) {
System.err.println("out.txt no puede abrirse");
} finally {
if (out != null) {
out.close();
}
}
}
21
3: Ll bloque try Lermlna normalmenLe
public void escribeListaHasta(int top) {
PrintWriter out = null;
try {
out = new PrintWriter(new FileWriter("out.txt"));
for (int i = 0; i < top; i++) {
out.println("valor: " + i + " = " + v[i]);
}
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println(ndice fuera de rango);
} catch (IOException e) {
System.err.println("out.txt no puede abrirse");
} finally {
if (out != null) {
out.close();
}
}
}
22
finally
public class DPC {
public void divisin(int num1, int num2) {
try {
System.out.println(num1 + " / " + num2 + " = " + (num1 / num2));
} finally {
System.out.println("Finally hecho.");
}
System.out.println("Volviendo de divisin.");
}
public static void main(String[] args) {
new DPC().divisin(10, 0);
System.out.println("Volviendo de main.");
}
}
23
Salida:
Finally hecho.
java.lang.ArithmeticException: / by zero
at DPC.divisin(DPC.java:5)
at DPC.main(DPC.java:12)
Exception in thread "main"
finally
public class DPC {
public void divisin(int num1, int num2) {
try {
System.out.println(num1 + " / " + num2 + " = " + (num1 / num2));
} finally {
System.out.println("Finally hecho.");
}
System.out.println("Volviendo de divisin.");
}
public static void main(String[] args) {
try {
new DPC().divisin(10, 0);
} catch (ArithmeticException e) {
System.out.println("Divisin por cero.");
}
System.out.println("Volviendo de main.");
}
}
24
Salida:
Finally hecho.
Divisin por cero.
Volviendo de main.
Las excepclones de obllgado
LraLamlenLo (checked o comprobadas)
25
... lormaL... Lxcepuon
Lxcepuon
lnLerrupLedLxcepuon lCLxcepuon 8unumeLxcepuon
...
nullolnLerLxcepuon
lllegalArgumenLLxcepuon
lndexCuLCf8oundsLxcepuon
ArlLhmeucLxcepuon
Malformedu8LLxcepuon
lllenoLloundLxcepuon
ArraylndexCuLCf8oundsLxcepuon
numberlormaLLxcepuon
no comprobadas
Comprobadas
public void escribeListaHasta(int top) {
PrintWriter out = null;
try {
out = new PrintWriter(new FileWriter("out.txt"));
for (int i = 0; i < top; i++) {
out.println("valor: " + i + " = " + v[i]);
}
} catch (IOException e) {
System.err.println("out.txt no puede abrirse");
} finally {
if (out != null) {
out.close();
}
}
}
Las excepclones comprobadas deben ser LraLadas.







Lxcepclones comprobadas
26
Las excepclones comprobadas deben ser capLuradas o anuncladas
CapLuradas: se hace un LraLamlenLo con ellas.
Anuncladas: se anuncla en la cabecera del meLodo.







ueden anunclarse varlas excepclones, separadas por comas
Las excepclones no comprobadas sl queremos las podemos
anunclar Lamblen.
public void escribeListaHasta(int top) throws IOException {
PrintWriter out = new PrintWriter(
new FileWriter("out.txt"));
for (int i = 0; i < top; i++) {
out.println("valor: " + i + " = " + v[i]);
}
out.close();
}
ropagacln de excepclones comprobadas
27
8edenlcln de meLodos con clusula
throws
La denlcln del meLodo en la subclase slo puede especlcar un sub-
con[unLo de las clases de excepclones (lncluldas sus subclases) especl-
cadas en la clusula throws del meLodo redenldo en la superclase.
28
class A {
...
protected void mtodoX()
throws Excepcin1, Excepcin2, Excepcin3 {
...
}
...
}
class B extends A {
...
protected void mtodoX()
throws Excepcin1, Subc1Excepcin3, subc2Excepcin3 {
...
}
...
}
Lxcepclones relaclonadas
public void escribeListaHasta(int top) {
try {
PrintWriter out = new PrintWriter(
new FileWriter("out.txt"));
for (int i = 0; i < top; i++) {
out.println("valor: " + i + " = " + v[i]);
}
out.close();
} catch (FileNotFoundException e) {
System.err.println("out.txt no puede abrirse");
} catch (IOException e) {
System.err.println("Error de entrada/salida");
}
}
29
L[emplo: lnformacln sobre las excepclones
30
public class Ejemplo {
void aux(int tam) {
try {
int a[] = new int[tam];
a[4] = 0;
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("excepcin: " + e.getMessage());
e.printStackTrace();
}
}
public static void main(String[] args) {
new Ejemplo().aux(2);
System.out.println("fin");
}
}
Salida:
excepcin: 4
java.lang.ArrayIndexOutOfBoundsException
at Ejemplo.aux(Ejemplo.java:5)
at Ejemplo.main(Ejemplo.java:13)
fin
uenlendo nuesLras proplas excepclones
un usuarlo puede denlr sus proplas excepclones.
public class MiExcepcin extends Exception {
public MiExcepcin() {
super();
}
public MiExcepcin(String msg) {
super(msg);
}
public MiExcepcin(int i) {
super(Integer.toString(i));
}
}
? ahora puede lanzarse como las dems.
throw new MiExcepcin(5);
31
L[emplo: lanzando nuesLra excepcln
public class Ejemplo {
public void divisin(int num1, int num2) throws MiExcepcipn {
if (num2 == 0) {
throw new MiExcepcin(num1);
}
System.out.println(num1 + " / " + num2 + " = " + (num1 / num2));
}
public static void main(String[] args) {
try {
new Ejemplo().divisin(10, 0);
System.out.println("Divisin hecha.");
} catch (MiExcepcin e) {
System.out.println("Nmero " + e.getMessage());
} finally {
System.out.println("Finally hecho.");
}
}
}
32
Salida:
Nmero 10
Finally hecho.
nuevas funclonalldades en !ava 1.7
Se ha modlcado la slnLaxls del bloque Lry

try (
// Se crean objetos closeables que se cerrarn
// automticamente al terminar el bloque try
) {
// cuerpo vigilado
} catch (Excepcin1 | Excepcin2 |
... | Excepcinn e) {
// Tratamiento comn para todas las excepciones
// capturadas
}
}
33
public void escribeListaHasta(int top) {
try (PrintWriter out = new PrintWriter(
new FileWriter("out.txt"))) {
for (int i = 0; i < top; i++) {
out.println("valor: " + i + " = " + v[i]);
}
} catch (IOException e) {
System.err.println("out.txt no puede abrirse");
}
}
34
8eglas para LraLar slLuaclones excepclonales
:.&+&(;+':
La comprobacln es poco cosLosa y es probable que se produzca la
excepcln.
L[emplo:
Ll meLodo interseccionCon(Recta r) de Recta
Ll meLodo extraerBola() de Urna

<%.';+':
La comprobacln es cosLosa y es raro que se produzca la excepcln.
L[emplo:
public int stringAInt(String str) {
return Integer.parseInt(str);
}
35

S-ar putea să vă placă și