Está en la página 1de 21

Excepciones en

Java

Introduccin - por qu usarlas?(1)

En el mundo de la programacin hay algo que


siempre ocurre los errores en los programas.

!ero "qu sucede realmente despus de que


ha ocurrido el error? "#u podemos hacer con
l? "$mo nos damos cuenta que se ha
producido?

El lengua%e Java utili&a excepciones para


permitir tra'a%ar me%or con los errores(

Introduccin - por qu usarlas?())

En la programacin tradicional* la deteccin* el in+orme y el mane%o de


errores se convierte en un cdigo muy liado( En pseudo-cdigo
leerFichero
{
abrir el fichero;
determinar su tamao;
asignar suficiente memoria;
leer el fichero a la memoria;
cerrar el fichero;
}

, primera vista esta +uncin parece 'astante sencilla* pero ignora todos
aquello errores potenciales(

"#u sucede si no se puede a'rir el +ichero?

"#u sucede si no se puede determinar la longitud del +ichero?

"#u sucede si no hay su+iciente memoria li're?

"#u sucede si la lectura +alla?

"#u sucede si no se puede cerrar el +ichero?

!ara responder a estas cuestiones dentro de la +uncin* tendr-amos que


a.adir mucho cdigo para la deteccin y el mane%o de errores(

Introduccin - por qu usarlas?(/)

En caso de no tenerlas* como en otros lengua%es de


programacin como !erl* tendremos que utili&ar
incmodos 'loques i+ para controlar los errores (peor*
podemos elegir ignorar que estos errores pueden
occurrir)( ,lgo parecido a esto
class InputFile {
FileInputStream fis;
InputFile(String filename) {
fis = new FileInputStream(filename);
if (fis == file_not_found) {
Systemoutprintln(!"rror#$ el fichero no e%iste&);
return;
}
else if (fis == sin_memoria) {
Systemoutprintln(!"rror$ sin memoria&);
return;
}
else if' (muchos m(s a)n')
}
}

Introduccin - por qu usarlas?(0)

1ediante el uso de excepciones para controlar errores*


los programas Java tienen las siguientes venta%as +rente
a las tcnicas de mane%o de errores tradicionales(

Separar el Manejo de Errores del Cdigo "Normal.

Estar en una zona separada donde podremos tratar las


excepciones como un cdigo especial.

ropagar los Errores so!re la ila de "lamadas

podemos propagar el error a la primera #uncin $ue llam a las


di%ersas #unciones &asta $ue llegamos al error.

'grupar Errores ( )i#erenciacin.

*racias a esto tenemos todos los posi!les errores juntos (


podemos pensar una manera de tratarlos $ue sea adecuado.

"#u es una excepcin?

2na excepcin es un evento que ocurre


durante la e%ecucin del programa que
interrumpe el +lu%o normal de las sentencias(

3 sea* algo que altera la e%ecucin normal(

1uchas clases de errores pueden generar


excepciones -- desde pro'lemas de hard4are*
como la aver-a de un disco duro* a los simples
errores de programacin* como tratar de
acceder a un elemento de un array +uera de sus
l-mites(

Jerarquia de excepciones de Java
5ile6ot5oundException
En rojo: son las excepciones que es obligatorio controlar. Checked exceptions
En azul: son las excepciones que no es obligatorio controlar. Unchecked exceptions

2so de Excepciones Java (1)

Este cdigo
public class *ello {
public static +oid main(String arg+,-){
int uno_die.,- = ne/ int,01-;
uno_die.,02- = 01;
}
}

!roducir-a esto(
Exception in thread 7main7 %ava(lang(,rrayIndex3ut3+8oundsException 1)
at 9ello(main(9ello(%ava:)

#u podemos hacer al respecto?

!odemos decirle al compilador que queremos tratar esa


excepcin* y aunque ocurra* el programa no terminar; y
haremos lo que queremos con ella(

2so de Excepciones Java ())

< lo har-amos as-* de manera que el programa no


+inali&ar-a con ese error* sino que podemos personali&ar
un mensa%e y decidir si continuar o no(
public class *ello {
public static +oid main(String arg+,-){
int uno_die.,- = ne/ int,01-;
try {
uno_die.,02- = 01;
} catch(java.lang.ArrayIne!"ut"f#$uns%!cepti$n) {
System.$ut.println(&%rr$r' hem$s s$(repasa$ el
tama)$ el array*);
++ a,u- p$em$s hacer l$ ,ue ,ueram$s
}
}
}

2so de Excepciones Java (/)

9ay algunos mtodos=constructores como


5ileInput>tream* que lan&an excepciones* y
de'emos tenerlo en cuenta* sino podemos
encontrarnos con errores de compilacin como
este
InputFile3a+a454 6arning4 "%ception 3a+aioFile7otFound"%ception must be caught$
or it must be declared in thro/s clause of this method
fis = ne/ FileInputStream(filename);
8

$lase Input5ile
public class InputFile {
FileInputStream fis;
InputFile(String filename) { 99 el constructor de la clase InputFile
fis = new FileInputStream(filename);
}
}

2so de Excepciones Java (/)

$omo puedes ver en el listado* la clase Input5ile ignora


completamente el hecho de que el constructor de 5ileInput>tream
puede lan&ar un excepcin(

>in em'argo* el lengua%e Java requiere que un mtodo haga algo


con las excepciones que se pueden lan&ar desde el (por e%emplo*
dentro del constructor Input5ile* 5ileInput>tream puede lan&ar una
excepcin) (

>e pueden hacer ) cosas

?an&ar la excepcin al mtodo llamante (con throws)( !or e%emplo


Input5ile puede lan&ar a su ve& la excepcin lan&ada por
5ileInput>tream( Eso es lo que hicimos en >umar(%ava

@ratar todas las excepciones que pueden ser lan&adas desde dentro de
su ;m'ito (como en la transparencia A)(

$omo la clase Input5ile no hace ninguna de las dos cosas* el


compilador rehBsa su compilacin e imprime el mensa%e de error(

2so de Excepciones Java (0)

El compilador dar; el primer error en la primera l-nea que est; en negrita (en la
diapositiva A)( Esta l-nea crea un o'%eto 5ileInput>tream y lo utili&a para a'rir un
+ichero (cuyo nom're se pasa dentro del constructor de 5ileInput>tream)(

Entonces* "#u de'e hacer el 5ileInput>tream si el +ichero no existe? 8ien* eso


depende de lo que quiera hacer el programa que utili&a el 5ileInput>tream(

?os implementadores de 5ileInput>tream no ten-an ni idea de lo que quiere hacer la


clase Input5ile si no existe el +ichero(

"Ce'e 5ileInput>tream terminar el programa?

"Ce'e intentar un nom're alternativo?

"de'er; crear un +ichero con el nom're indicado?

6o existe un +orma posi'le de que los implemetadores de 5ileInput>tream pudieran


elegir una solucin que sirviera para todos los usuarios de 5ileInput>tream( !or eso
ellos lan&aron una excepcin( Esto es* si el +ichero nom'rado en el argumento del
constructor de 5ileInput>tream no existe* el constructor lan&a una excepcin
ja%a.io.+ileNot+oundException( 1ediante el lan&amiento de esta excepcin*
5ileInput>tream permite que el mtodo llamador mane%e ese error de la +orma que
considere m;s apropiada(

Cmo Especi#icar las Excepciones
"anzadas por un M,todo

!odemos hacer que un mtodo nuestro lance excepciones


y lo especi+icaremos as- (aqu- se lan&an ) excepciones de
tipo I3Exception y ,rrayIndex3ut3+8oundsException)

pu'lic void 4rite?ist() thro4s I3Exception*


,rrayIndex3ut3+8oundsException D

@odos los mtodos Java utili&an la sentencia t&ro- para


lan&ar una excepcin(

Esta sentencia requiere un slo argumento* un o'%eto @hro4a'le(


En el sistema Java* los o'%etos lan&a'les son e%emplares de la
clase @hro4a'le de+inida en el paquete %ava(lang* como por
e%emplo

thro4 ne- Empt(Stac.Exception/01



2e$uerimientos 3a%a para Capturar o
Especi#icar Excepciones

Capturar /tr(4catc&0. 2n mtodo puede capturar una


excepcin proporcionando un mane%ador para ese tipo
de excepcin(

Especi#icar /t&ro-s0. >i un mtodo decide no capturar


una excepcin* de'e especi+icar que puede lan&ar esa
excepcin(

"!or qu hicieron este requerimiento los dise.adores de Java?

!orque una excepcin que puede ser lan&ada por un mtodo es


realmente una parte del inter+ace de programacin pB'lico del
mtodo( ,s-* en la +irma del mtodo de'e especi+icar las
excepciones que el mtodo puede lan&ar(

Capturar ( Manejar Excepciones/50

El !lo$ue tr(

El primer paso en la escritura de una mane%ador de excepciones es poner la sentencia Java


dentro de la cual se puede producir la excepcin dentro de un 'loque tr((

>e dice que el 'loque tr( go'ierna las sentencias encerradas dentro de l y de+ine el ;m'ito
de cualquier mane%ador de excepciones (esta'lecido por el 'loque catc&) asociado con l(

"os !lo$ues catc&

Cespus se de'e asociar un mane%ador de excepciones con un 'loque tr(


proporcion;ndole uno o m;s 'loques catc& directamente despus del 'loque tr((

El !lo$ue #inall(

El 'loque #inall( de Java proporciona un mecanismo que permite a sus mtodos limpiarse a
si mismos sin importar lo que sucede dentro del 'loque tr(( >e utili&a el 'loque #inall( para
cerrar +icheros o li'erar otros recursos del sistema despues de que occurra una excepcin(

EJE1!?3 (aqu- capturamos y mane%amos ) tipos de excepciones)


try {

}
catch (:rrayInde%;ut;f<ounds"%ception e) {
Systemerrprintln(=>aught :rrayInde%;ut;f<ounds"%ception4 = ? eget@essage());
}
catch (I;"%ception e) {
Systemerrprintln(=>aught I;"%ception4 = ? eget@essage());
}

Capturar ( Manejar Excepciones/60

>upongamos que ocurre una excepcin


I3Exception dentro del 'loque tr((

El sistema de e%ecucin inmediatamente toma


posesin e intenta locali&ar el mane%ador de
excepcin adecuado(

Empie&a 'uscando al principio de la pila de llamadas(

>in em'argo* si el constructor de 5ile3utput>tream


no tiene un mane%ador de excepcin apropiado por
eso el sistema de e%ecucin comprue'a el siguiente
mtodo en la pila de llamadas -- el mtodo
-rite"ist/0(

Capturar 7arios 8ipos de
Excepciones con un Manejador
try {

}
catch ("%ception e) { Systemerrprintln(="%ception caught4 = ? eget@essage());
}

?a clase Exception est; 'astante arri'a en el ;r'ol de


herencias de la clase @hro4a'le( !or eso* adem;s de
capturar los tipos de I3Exception y
,rrayIndex3ut3+8oundsException este mane%ador de
excepciones* puede capturar otros muchos tipos(
Eeneralmente ha'lando* los mane%adores de excepcin
de'en ser m;s especiali&ados(

2n e%emplo
public +oid /riteAist()
{
BrintStream pStr = null;
try {
int i;
Systemoutprintln(="ntrando en la Sentencia try=);
pStr = ne/ BrintStream(ne/ <uffered;utputStream( ne/
File;utputStream(=;utFilet%t=)));
for (i = 1; i C si.e; i??)
pStrprintln(=Dalue at4 = ? i ? = = = ?
miDectorelement:t(i));
} catch (ArrayIne!"ut"f#$uns%!cepti$n e) {
System.err.println(./aught ArrayIne!"ut"f#$uns%!cepti$n0 . 1
e.get2essage());
} catch (I"%!cepti$n e) {
Systemerrprintln(=>aught I;"%ception4 = ? eget@essage()); }
finally {
if (pStr #= null) { Systemoutprintln(=>errando BrintStream=);
pStrclose();
} else {
Systemoutprintln(=BrintStream no est( abierto=);
}
}
}

2n e%emplo (explicacin)

El 'loque tr( de este mtodo tiene tres


posi'ilidades de salida direrentes(

?a sentencia ne- +ile9utputStream +alla y


lan&a una I3Exception(

?a sentencia %ictor.element't/i0 +alla y lan&a


una ,rrayIndex3ut3+8oundsException(

@odo tiene xito y la sentencia tr( sale


normalmente(

8reve Fesumen

?as excepciones sirven para tratar errores en la


e%ecucin del programa(

?as +unciones de clases que lan&an (thro4)


excepciones* de'en ser llamadas desde
mtodos que las tratan con un 'loque tryG
catch* o que vuelven a lan&an las excepciones(

!odemos de+inir mtodos que lan&an


excepciones(

1;s in+ormacin

8radley H%ell* $urso 3nline* $apitulos IJ y I1


http==chortle(ccsu(edu=$>1K1=cs1K1%ava(html

9andling Errors 4ith Exceptions - tutorial de >un


http==%ava(sun(com=docs='ooLs=tutorial=essential=exceptions=

También podría gustarte