Sie sind auf Seite 1von 5

Jerarqua de de Errores y Excepciones

De la ejecucin de nuestros programas va a surgir una serie de errores que debemos manejar de alguna manera. Para esto debemos determinar qu los provoca y, una vez definido eso, analizar qu camino tomar, evitar el error, mostrar un mensaje comprensible para el usuario, abortar la ejecucin del programa, etc. Java define una excepcin como un objeto que es una instancia de la clase Throwable, o alguna de sus subclases. s decir que estamos ante una jerarqu!a de excepciones. Para comenzar, de "#ro$able #eredan las clases Error y Exception .
-lass+ot.ound xception /nterrupted xception

Exception

/& xception 0untime xception ,1* xception

&bject

"#ro$able
*in3age rror 45" rror "#readDeat# 2irtual'ac#ine rror

rror

Por lo general, un error tiende a provocarse en condiciones anormales, eso significa que no tiene sentido o no es posible capturarlo. Por ejemplo, %&ut&f'emory rror( indica que no #ay m)s memoria. Debido a la imposibilidad de capturar los errores, el programa termina. *as excepciones, en cambio, se producen dentro de condiciones normales, es decir que no slo es posible capturarlas, sino que tambin el lenguaje nos obliga a capturarlas y manejarlas. +unca olvidemos que una excepcin no es un error, sino un evento que nuestro programa no sabe cmo manejar. ,iempre que se provoque una excepcin, podemos capturarla y manejarla, o evitarla cambiando la lgica del programa.

Control de Excepciones (try catch finally)


Para capturar y manejar las excepciones, Java proporciona las siguientes sentencias6 try, catch y finally ntre un try y un catc# vamos a escribir el cdigo de programa que pueda provocar una excepcin. *a estructura general es la siguiente6
try{ // Ac va el bloque que puede provocar una excepcin } catch(NombreDeLaExcepcion in tancia!{ // Ac va el bloque que mane"a la excepcin en ca o de producir e }

n el catc# va el nombre de la excepcin que deseamos capturar. ,i no sabemos qu excepcin es, recordemos que #ay una jerarqu!a de excepciones, de tal forma que se puede poner la clase padre de todas las excepciones6 Exception 2eamos un ejemplo que produce una excepcin, pero no vamos a capturarla, para analizar un poco la salida de error
# $ % + / 4 6 7 #1 ## #$ #% ##+ #/ #4

public cla private

E"emploException { tatic int&' arre(lo ) ne* int&+',

public tatic void main(.trin(&' ar( ! { 0or(int x)1, x2+, x33!{ arre(lo&x' ) x5$, } 8ue traArray(!, } public tatic void 8ue traArray(!{ 0or(int x)1, x2)+, x33!{ .y tem9out9println(arre(lo&x'!, } }

4l compilar y ejecutar el programa se obtiene lo siguiente6


0 2 4 6 8 Exception in thread "main" java.lang.ArrayIndexOutO !ound"Exception# $ at ejemploexception.EjemploException.%ue"traArray&EjemploException.java#'4( at ejemploexception.EjemploException.main&EjemploException.java#)( *ava +e"ult# '

l programa no causa ning7n error de compilacin, pero s! un error de ejecucin. sto es un Runti eException. 4nalizando el error vemos, primero, el nombre de la excepcin provocada, en este caso !rray"ndex#ut#f$oundsException , y a continuacin, el mensaje de error. *uego de informar la excepcin, muestra la l!nea exacta en que fue provocada. s conveniente leer esto de abajo #acia arriba, de manera tal que podamos ver dnde empez todo e ir siguindolo con nuestro cdigo. 2emos que todo empez en la l!nea 8, de paquete %ejemploexception(, en la clase % jemplo xception(, en el mtodo %main(. ,i vamos a esta l!nea vemos que es donde llamamos el mtodo 'uestra4rray9:. ,eguimos #acia arriba, y a#ora vemos que el error est) en la l!nea ;< del paquete %ejemploexception(, en la salida por pantalla, en esta l!nea es donde sacamos un elemento del arreglo, es entonces cuando determinamos cu)l es la l!nea de cdigo que provoca el error y por qu. 4#ora debemos elegir una solucin. Podemos cambiar el l!mite del 0or de = a <, para asegurarnos de no querer sacar m)s elementos, o podemos capturar la excepcin y manejarla. Para capturar la excepcin debemos poner las l!neas que provocaron la excepcin entre un try y un catch n el ejemplo anterior debemos encerrar al ciclo for del mtodo 'uestra4rray9:6
# $ % + / 4 6 7 #1 ## #$ #% ##+ #/ #4 #6 #7 $1 $# $$

public cla private

E"emploException { tatic int&' arre(lo ) ne* int&+',

public tatic void main(.trin(&' ar( ! { 0or(int x)1, x2+, x33!{ arre(lo&x' ) x5$, } 8ue traArray(!, } public tatic void 8ue traArray(!{ try{ 0or(int x)1, x2)+, x33!{ .y tem9out9println(arre(lo&x'!, } } catch(Array:ndex;ut;0<ound Exception ex!{ .y tem9out9print(=.e intent acar m }

elemento >!,

4#ora la salida es la siguiente6


0 2 4 6 8 ,e intent- "acar m." elemento"

-omo vemos, lo 7nico que logramos es mostrar el mismo error, slo que de manera mas comprensible. n ciertos casos, vamos a usar el bloque catch para evitar el error, no slo

para mostrarlo. l lenguaje no nos obliga a capturar las excepciones que se provocan en tiempo de ejecucin, sin embargo, stas se producen, y muy a menudo. ntonces, empezar) ejecutando el try, si se produce alguna excepcin, corta el try y ejecuta el catch. .inalmente, lo que va en el bloque finally, se ejecutar) siempre, #aya #abido excepciones o no. 4lgo muy com7n es usar dic#o bloque para limpiar variables, cerrar arc#ivos, restablecer conexiones, es decir, tareas que #ayan podido quedar truncadas seg7n se #aya ejecutado el try completo o no. *a estructura de un bloque con try, catc# y finally es la siguiente6
try{ // Ac va el bloque que puede provocar una excepcin } catch(NombreDeLaExcepcion in tancia!{ // Ac va el bloque que mane"a la excepcin en ca o de producir e } 0inally{ // E te bloque e e"ecuta iempre in importar i e e"ecuto el // bloque del try o del catch }

Excepciones %en&ricas' Podemos tener cuantos catch creamos necesarios, cada uno para capturar una excepcin especifica, con la ventaja que podremos manejar cada una de ellas de manera distinta, pero puede suceder que como resultado de la ejecucin del programa se provoque una excepcin que el programa no estaba preparado para manejar. 4provec#ando la jerarqu!a de excepciones, podemos reemplazar todos los catch de excepciones particulares por la superclase Exception, #aciendo una captura genrica. Para tener una idea del problema ocurrido se pueden utilizar los objetos (et)essa*e() o print+tac,Trace().
## #$ #% ##+ #/ #4 #6 #7 $1 $# $$

public

tatic void 8ue traArray(!{ try{ 0or(int x)1, x2)+, x33!{ .y tem9out9println(arre(lo&x'!, } } catch(Exception ex!{ ex9print.tac?@race(!, }

!se-eraciones (assert)
*as aseveraciones permiten comprobar las presunciones que #aces sobre el cdigo mientras se esta desarrollando, sin tener que manejar excepciones que se cree que nunca, ocurrir)n. ,intaxis6
a a ert (condicin!, ert (condicin! C =8en a"e>

,upongamos que se escribe un cdigo seg7n el cual si x>?, sucede una cosa, y si x@@?, sucede otra. ,e puede expresar de la siguiente manera6
i0 (x A 1!{ // Bdi(o en ca o que e cumpla la condicin } el e{ // Bdi(o en ca o que N; e cumpla la condicin }

,e supone que nunca suceder) que x./A pero, By si algo va mal y resulta que x tiene un valor negativoC n este caso, se ejecutar!a la parte de cdigo correspondiente a else, como si x00/, con resultados impredecibles. Para evitarlo, se puede usar una aseveracin6
i0 (x A // } el e{ a // } 1!{ Bdi(o en ca o que e cumpla la condicin

ert (x )) 1!, Bdi(o en ca o que N;

e cumpla la condicin

!cti-aci1n de las !se-eraciones en 2et$eans 34/' D.ileD DProject Properties 9nombre del proyecto:D legir la opcin %0un(, y en %2' &ptions( agregar el siguiente par)metro %Eenableassertions( 9sin comillas: