You are on page 1of 22

Qu es una excepcin?

1 2

INTRODUCCIN QUE ES UNA EXCEPCIN?

2.1 COMO SE PUEDE ARROJAR UNA EXCEPCIN? 2.2 CULES SON LOS TIPOS DE EXCEPCIONES EN JAVA Y CUANDO SE PRODUCEN?

2.3 EJEMPLO DE LANZAMIENTO DE EXCEPCIN (INSTRUCCIN THROW) 2.4 COMO SE CONTROLAN LAS EXCEPCIONES? 2.5 EJEMPLO DE MANEJO DE EXCEPCIONES (IMPLEMENTACIN DE LOS BLOQUES try, catch y finally) 3 4 CONCLUSION BIBLIOGRAFA

1.- INTRODUCCIN

El control de flujo de un programa Java sabemos hasta ahora que se lleva a cabo con sentencias del tipo if, while, for, return, break, etc Estas sentencias forman un conjunto de palabras reservadas que determinan cierta funcionalidad. Pues bien, ninguna de ellas tiene en cuenta que se puedan producir errores en tiempo de ejecucin de un programa y por tanto Java necesita de un conjunto de palabras nuevas para tener en cuenta que cualquier cdigo puede fallar o ser mal interpretado en tiempo de ejecucin. Vamos a ver tres de las palabras reservadas para tratamiento de excepciones: - Try. - Catch. - Finally. Aunque posteriormente veremos otras palabras ms avanzadas y otras formas de tratamiento de errores, stas son las primeras y ms bsicas con las que vamos a trabajar. De forma introductoria diremos que hay dos formas de tratar errores en Java: capturarlos o lanzarlos. El uso de try catch finally corresponde a la captura de errores. Vamos a poner un smil sencillo: un error es algo inesperado, como encontrarte un ladrn dentro de tu casa. Cuando nos encontramos con un error podemos capturarlo (equivaldra a capturar el ladrn) o lanzarlo (equivaldra a tratar de hacer huir al ladrn, de hacer que salga fuera del lugar donde se encuentra).

2.- QUE ES UNA EXCEPCIN? Una excepcin es un evento que ocurre durante la ejecucin de un programa y que rompe el flujo normal del mismo. Los errores son algo intrnseco a cualquier aplicacin informtica. Ms all de los errores de sintaxis, los cuales se corrigen necesariamente para que la aplicacin pueda compilar, se encuentran los posibles errores que pueden ocurrir durante su ejecucin. Un ejemplo clsico es el de intentar operar sobre un archivo sin contar con los permisos adecuados. Otro ejemplo es el de intentar realizar una divisin por cero. Cada aplicacin tiene sus propias fuentes de errores en tiempo de ejecucin, y cuanto mayor sea su tamao ms fuentes de errores aparecern. Si no se controlan estos errores, cuando sucedan la aplicacin se detendr bruscamente y dejar de funcionar. Pero implementar dicho control no es en absoluto trivial y aadira, con toda seguridad, bastante complejidad al cdigo. Puedes imaginrtelo; controlar, al fin y al cabo significa comprobar y decidir, y esto ltimo se traslada finalmente al cdigo en forma de sentencias if-then-else, las

cuales, especialmente cuando se anidan, no ayudan precisamente a conseguir un cdigo legible y entendible. Para facilitar esta tarea de control de errores se ha diseado un mecanismo que proporcionan la mayor parte de los lenguajes de programacin: el mecanismo de Excepciones.

El funcionamiento bsico es como sigue: La Excepcin es un objeto que lleva informacin acerca del error que ha ocurrido y que se puede crear en aquellos puntos del programa donde se ha previsto la posibilidad de un error. Cuando las condiciones del error se dan, se lanza dicha excepcin. En ese momento se pone en funcionamiento el mecanismo de excepciones que corta controladamente la ejecucin normal del programa, trasladando la excepcin a la parte de la aplicacin que llam al cdigo donde se ha producido el error (la excepcin), para que maneje la situacin y decida lo que debe hacerse. De esta manera, si el programador as lo ha decidido, no se produce una salida brusca e incontrolada. En el siguiente diagrama de secuencia hemos modelado tres posibles escenarios en los que un objeto crea a otro objeto para realizar alguna tarea. El primer caso muestra la situacin normal, sin fallo. El objeto 1 crea el objeto 2 y este ltimo realiza su tarea y, una vez finalizada, devuelve el resultado al objeto 1. Fin de la historia. El segundo caso representa la misma secuencia que el primero, pero suponemos que se ha producido un error incontrolado en el objeto 2. El resultado es que la aplicacin termina bruscamente. En el tercer caso tambin se produce el error, pero ahora se ha controlado con una excepcin. El resultado es que el programa no termina, si no que el objeto 2 crea una excepcin y se la enva como

resultado al objeto 1, el cual se dar cuenta de que ha ocurrido un fallo y, examinando la excepcin, podr determinar como finalizar el programa de una manera elegante (por ejemplo, arrojando un mensaje con la causa del error).

2.1

CMO SE PUEDE ARROJAR UNA EXCEPCIN?

Para que una excepcin se pueda capturar, primero se ha debido arrojar en algn lugar. Muchas de las clases de los paquetes nativos de Java arrojan excepciones, pero tambin podemos arrojar excepciones desde nuestro cdigo mediante la sentencia throw
throw someThrowableObject;

E incluso crear nuestras propias excepciones que deben extender la clase Exception. La funcin miembro que lanza una excepcin tiene la declaracin habitual que cualquier otro mtodo pero se le aade a continuacin la palabra reservada throws seguido de la excepcin o excepciones que puede lanzar.
static void rango(int num, int den)throws ExcepcionIntervalo{ if((num>100)||(den<-5)){ throw new ExcepcionIntervalo("Nmeros fuera del intervalo"); }

Cuando el numerador es mayor que 100 y el denominador es menor que 5 se lanza throw una excepcin, un objeto de la clase ExcepcionIntervalo. Dicho objeto se crea llamando al constructor de dicha clase y pasndole un string que contiene el mensaje "Nmeros fuera del intervalo".

2.2 CULES SON LOS TIPOS DE EXCEPCIONES EN JAVA Y CUANDO SE PRODUCEN? En Java existen tres tipos de excepciones:

Checked exception. Son excepciones controladas en el cdigo. En una aplicacin bien construida todas las excepciones deberan de ser de este tipo, pues significa que el programador ha tenido en cuenta todos los errores que la aplicacin puede arrojar y los ha controlado con el mecanismo de excepciones. Unchecked exception, son errores que no se han controlado en el cdigo, es decir, bugs. En estos casos Java arroja una excepcin del

tipoRunTimeException, que, en ltima instancia, provoca una salida brusca e incontrolada de la aplicacin. Estas excepciones tambin pueden ser capturada, pero tiene ms sentido corregir el bug que las provoca. Error. Son errores que no pueden preverse (un fallo del hardware, por ejemplo). Esto no hay manera de controlarlo.

Como hemos dicho, tanto las excepciones checked como uncheked se pueden capturar, la diferencia es que las primeras hay que manejarlas necesariamente, mientras que en las segundas no es necesario, siendo el propio sistema el que aborta con un mensaje que advierte de que se ha producido un error en tiempo de ejecucin. Cuando ocurre un error en un mtodo de alguna clase de Java, este mtodo crea un objeto con informacin sobre el error que se denomina Excepcion y es entregado al sistema runtime. Dicho sistema va recorriendo en sentido inverso, toda la pila de mtodos llamados hasta que encuentra un manejador de excepciones que coincida con el tipo de excepcin lanzada y que se encargar de decidir cmo proceder ante este corte de la ejecucin normal del programa. Del prrafo anterior se deduce que son tres los elementos necesarios para poder utilizar el mecanismo de control de exepciones:

Algn objeto que extienda del tipo Exception y que representa la excepcin con informacin acerca del error. Un objeto que arroje la excepcin anterior cuando se prevea el error. Un bloque de cdigo que haga uso del objeto anterior donde se capturarn las posibles excepciones arrojadas por dicho objeto. A este bloque se le llama manejador de excepciones (exception handler).

2.3 EJEMPLO DE LANZAMIENTO DE EXCEPCIN (INSTRUCCIN THROW) Partiendo de la base de que cualquier mtodo puede lanzar excepciones en Java, es aconsejable tener declaradas todas las posibles excepciones que se puedan generar en dicho mtodo, para lo cual se utilizar la clusula throws de la declaracin de mtodos. Para que se pueda lanzar una excepcin es necesario crear un objeto de tipo Exception o alguna de sus subclases como ArithmeticException y lanzarlo mediante la instruccin throw como se muestra en el siguiente ejemplo:

Un manejador de excepciones es una porcin de cdigo que se va a encargar de tratar las posibles excepciones que se puedan generar. En Java, de forma similar a C++ se pueden tratar las excepciones previstas por el programador utilizando unos mecanismos, los manejadores de excepciones, que se estructuran en tres bloques: El bloque try El bloque catch El bloque finally Hay algunos mtodos/constructores como FileInputStream, que lanzan excepciones, y debemos tenerlo en cuenta, sino podemos encontrarnos con errores de compilacin como este:
InputFile.java:8: Warning: Exception java.io.FileNotFoundException must be caught, or it must be declared in throws clause of this method. fis = new FileInputStream(filename); ^ Clase InputFile: public class InputFile { FileInputStream fis; InputFile(String filename) { // el constructor de la clase InputFile fis = new FileInputStream(filename); } }

Como puedes ver en el listado, la clase InputFile ignora completamente el hecho de que el constructor de FileInputStream puede lanzar un excepcin.

Sin embargo, el lenguaje Java requiere que un mtodo haga algo con las excepciones que se pueden lanzar desde el (por ejemplo, dentro del constructor InputFile, FileInputStream puede lanzar una excepcin) . Se pueden hacer 2 cosas: Lanzar la excepcin al mtodo llamante (con throws). Por ejemplo InputFile puede lanzar a su vez la excepcin lanzada por FileInputStream. Eso es lo que hicimos en Sumar.java Tratar todas las excepciones que pueden ser lanzadas desde dentro de su mbito (como en la transparencia 9). Como la clase InputFile no hace ninguna de las dos cosas, el compilador rehsa su compilacin e imprime el mensaje de error. El compilador dar el primer error en la primera lnea que est en negrita (en la diapositiva 9). Esta lnea crea un objeto FileInputStream y lo utiliza para abrir un fichero (cuyo nombre se pasa dentro del constructor de FileInputStream). Entonces, Qu debe hacer el FileInputStream si el fichero no existe? Bien, eso depende de lo que quiera hacer el programa que utiliza el FileInputStream. Los implementadores de FileInputStream no tenan ni idea de lo que quiere hacer la clase InputFile si no existe el fichero. Debe FileInputStream terminar el programa? Debe intentar un nombre alternativo? deber crear un fichero con el nombre indicado? No existe una forma posible de que los implementadores de FileInputStream pudieran elegir una solucin que sirviera para todos los usuarios de FileInputStream. Por eso ellos lanzaron una excepcin. Esto es, si el fichero nombrado en el argumento del constructor de FileInputStream no existe, el constructor lanza una excepcin java.io.FileNotFoundException. Mediante el lanzamiento de esta excepcin, FileInputStream permite que el mtodo llamador maneje ese error de la forma que considere ms apropiada. Podemos hacer que un mtodo nuestro lance excepciones y lo especificaremos as (aqu se lanzan 2 excepciones de tipo:
IOException y ArrayIndexOutOfBoundsException). public void writeList() throws IOException, ArrayIndexOutOfBoundsException {

<<Todos los mtodos Java utilizan la sentencia throw para lanzar una excepcin>>

Esta sentencia requiere un slo argumento, un objeto Throwable. En el sistema Java, los objetos lanzables son ejemplares de la clase Throwable definida en el paquete java.lang, como por ejemplo:
throw new EmptyStackException();

Capturar (try-catch). Un mtodo puede capturar una excepcin proporcionando un manejador para ese tipo de excepcin. Especificar (throws). Si un mtodo decide no capturar una excepcin, debe especificar que puede lanzar esa excepcin.

2.4 COMO SE CONTROLAN LAS EXCEPCIONES? Por qu hicieron este requerimiento los diseadores de Java? Porque una excepcin que puede ser lanzada por un mtodo es realmente una parte del interface de programacin pblico del mtodo. As, en la firma del mtodo debe especificar las excepciones que el mtodo puede lanzar. El bloque try. El primer paso en la escritura de una manejador de excepciones es poner la sentencia Java dentro de la cual se puede producir la excepcin dentro de un bloque try. Se dice que el bloque try gobierna las sentencias encerradas dentro de l y define el mbito de cualquier manejador de excepciones (establecido por el bloque catch) asociado con l. Los bloques catch. Despus se debe asociar un manejador de excepciones con un bloque try proporcionndole uno o ms bloques catch directamente despus del bloque try. El bloque finally. El bloque finally de Java proporciona un mecanismo que permite a sus mtodos limpiarse a si mismos sin importar lo que sucede dentro del bloque try. Se utiliza el bloque finally para cerrar ficheros o liberar otros recursos del sistema despus de que ocurra una excepcin. EJEMPLO (aqu capturamos y manejamos 2 tipos de excepciones):
try { ... } catch (ArrayIndexOutOfBoundsException e) { System.err.println("Caught ArrayIndexOutOfBoundsException: " + e.getMessage()); } catch (IOException e) { System.err.println("Caught IOException: " + e.getMessage()); }

Supongamos que ocurre una excepcin IOException dentro del bloque try. El sistema de ejecucin inmediatamente toma posesin e intenta localizar el manejador de excepcin adecuado. Empieza buscando al principio de la pila de llamadas. Sin embargo, si el constructor de FileOutputStream no tiene un manejador de excepcin apropiado por eso el sistema de ejecucin comprueba el siguiente mtodo en la pila de llamadas -- el mtodo writeList(). La clase Exception est bastante arriba en el rbol de herencias de la clase Throwable. Por eso, adems de capturar los tipos de IOException y ArrayIndexOutOfBoundsException este manejador de excepciones, puede capturar otros muchos tipos. Generalmente hablando, los manejadores de excepcin deben ser ms especializados. Un ejemplo: public void writeList() { PrintStream pStr = null; try { int i; System.out.println("Entrando en la Sentencia try"); pStr = new PrintStream(new BufferedOutputStream( new FileOutputStream("OutFile.txt"))); for (i = 0; i < size; i++) pStr.println("Value at: " + i + " = " + miVector.elementAt(i)); } catch (ArrayIndexOutOfBoundsException e) { System.err.println("Caught ArrayIndexOutOfBoundsException: " + e.getMessage()); } catch (IOException e) { System.err.println("Caught IOException: " + e.getMessage()); } finally { if (pStr != null) { System.out.println("Cerrando PrintStream"); pStr.close(); } else { System.out.println("PrintStream no est abierto"); } } }
EXPLICACIN

El bloque try de este mtodo tiene tres posibilidades de salida direrentes.

La sentencia new FileOutputStream falla y lanza una IOException. La sentencia victor.elementAt(i) falla y lanza una ArrayIndexOutOfBoundsException. Todo tiene xito y la sentencia try sale normalmente.

2.5 EJEMPLO DE MANEJO DE EXCEPCIONES (IMPLEMENTACIN DE LOS BLOQUES try, catch y finally) El control de los errores de una aplicacin suele ser unas de las partes ms farragosas en el desarrollo de una aplicacin. De hecho, si no se hace con sumo cuidado, se corre el riesgo de contaminar el cdigo con cientos de control es y saltos que dificultan la lectura del cdigo y, por tanto, su mantenibilidad y escalabilidad. El mecanismo de excepciones proporciona una solucin elegante y ordenada a este inevitable problema. BLOQUE TRY Try en ingls es el verbo intentar, as que todo el cdigo que vaya dentro de esta sentencia ser el cdigo sobre el que se intentar capturar el error si se produce y una vez capturado hacer algo con l. Lo ideal es que no ocurra un error, pero en caso de que ocurra un bloque try nos permite estar preparados para capturarlo y tratarlo. As un ejemplo sera: try { System.out.println(bloque de cdigo donde pudiera saltar un error es este); BLOQUE CATCH En este bloque definimos el conjunto de instrucciones necesarias o de tratamiento del problema capturado con el bloque try anterior. Es decir, cuando se produce un error o excepcin en el cdigo que se encuentra dentro de un bloque try, pasamos directamente a ejecutar el conjunto de sentencias que tengamos en el bloque catch. Esto no es exactamente as pero ya explicaremos ms adelante todo el funcionamiento. De momento para una mejor comprensin vamos a considerar que esto es as. catch (Exception e) { System.out.println(bloque de cdigo donde se trata el problema); } Fjate que despus de catch hemos puesto unos parntesis donde pone Exception e. Esto significa

que cuando se produce un error Java genera un objeto de tipo Exception con la informacin sobre el error y este objeto se enva al bloque catch. BLOQUE FINALLY Y para finalizar tenemos el bloque finally que es un bloque donde podremos definir un conjunto de instrucciones necesarias tanto si se produce error o excepcin como si no y que por tanto se ejecuta siempre. finally { System.out.println(bloque de cdigo ejecutado siempre); } EJEMPLO SIN ERROR A continuacin vamos a ver cmo se comporta un programa con tratamiento de errores pero donde no se produce ningn error. Escribe este cdigo en tu editor. /* Ejemplo Gestin de Excepciones Java aprenderaprogramar.com */ public class Programa { public static void main (String [] args) { try{ System.out.println("Intentamos ejecutar el bloque de instrucciones:"); System.out.println("Instruccin 1."); System.out.println("Instruccin 2."); System.out.println("Instruccin 3, etc."); } catch (Exception e) { System.out.println("Instrucciones a ejecutar cuando se produce un error"); } finally{ System.out.println("Instrucciones a ejecutar finalmente tanto si se producen errores como si no."); } } } La salida obtenida tras ejecutar el programa anterior es:

Como podemos observar, se han ejecutado todas las instrucciones del bloque try y finalmente se ejecut la instruccin del bloque finally. No se ejecuta el bloque catch porque no hubo error. EJEMPLO CON ERROR A continuacin vamos a ver cmo se comporta un programa con tratamiento de errores cuando se produce un error y cmo afecta al control de flujo del programa. Escribe este cdigo en tu editor.

Se produce un error porque el mtodo parseInt de la clase Integer espera que dentro de las comillas llegue un nmero y no una letra. Por ejemplo int n = Integer.parseInt("65"); sirve para transformar el String 65 en un int de valor 65. Al no encontrar un valor vlido se produce un error de tipo java.lang.NumberFormatException. La salida obtenida en este caso donde se produce error es:

Prueba a escribir dentro del bloque catch lo siguiente: System.out.println("Se ha producido un error " +e ); Trata de interpretar lo que se visualiza en pantalla. Como podemos observar, ejecutamos las instrucciones del bloque try que no dan errores, pero cuando en

una instruccin se produce un error o excepcin inesperada se deja de ejecutar el cdigo del bloque try, y pasamos a ejecutar el cdigo del bloque catch. Hay un salto o cambio en el flujo del programa. Finalmente se ejecutan, en todo caso, las instrucciones del bloque finally como hemos comentado anteriormente. El bloque finally no es obligatorio, es decir, puede existir un bloque try catch y no existir bloque finally.

CONCLUSIN:

Los errores en Java se pueden capturar o lanzar. La captura se realiza con bloques try catch, donde por un lado tenemos el cdigo para el caso de flujo sin problemas del programa y por otro el cdigo con instrucciones para el tratamiento de errores. Las excepciones sirven para tratar errores en la ejecucin del programa. Las funciones de clases que lanzan (throw) excepciones, deben ser llamadas desde mtodos que las tratan con un bloque try catch, o que vuelven a lanzan las excepciones. Podemos definir mtodos que lanzan excepciones. Una excepcin es el indicador de un problema: una mala operacin o situacin anmala que ocurre durante la ejecucin de un programa. Java es un lenguaje bien diseado y muy maduro. Por ello todas las clases de su API standard estn construidas de manera que arrojan excepciones checked cuando ocurre algn tipo de error. Por esa razn, cuando utilizamos alguna de esas clases el propio compilador nos avisa de que, para poder compilar la aplicacin, debemos: escribir el cdigo de manera que capturemos la excepcin o especificarla en la declaracin del mtodo. Este hecho es una ayuda inestimable para mejorar la calidad de nuestros desarrollos, ya que una aplicacin bien construida debera controlar sus errores. No obstante, cuando desarrollamos libreras de clases de factura propia, aunque deberamos analizar y localizar los puntos de nuestro cdigo y lanzar una excepcin all donde pueda ocurrir un error, no estamos obligado a hacerlo, pero si no lo hacemos se degradar la calidad de nuestra aplicacin. Es importante recordar este punto y no dejarse llevar por la pereza y la tentacin de dejar trozos de cdigo donde pueden ocurrir errores sin lanzar la correspondiente excepcin.

Por ltimo Java nos ofrece una amplia y completa jerarqua de Excepciones que puedes examinar en el rbol del paquete java.lang: jerarqua completa del paquete java.lang Podemos (y debemos) utilizar estas Excepciones para lanzarlas all donde localicemos un posible fallo del programa. Cual utilicemos depende de la naturaleza del error. En ltimo caso, si no queremos discriminar por tipo de error, podemos lanzar siempre una excepcin del tipo Exception, que es la ms general de todas. Pero tambin podemos crear nuestras propias excepciones, ampliando la jerarqua ofrecida por el paquete standard. Y por fin vamos a ver como se traduce todo esto en cdigo. El siguiente cdigo muestra la estructura bsica de un bloque de cdigo sometido a captura de excepciones.
try { // Trozo de programa sometido a captura de excepciones. Alguna de las clases // que aqu se utilizan, pueden arrojar excepciones de algn tipo } catch (ExceptionType e) { // Cdigo que debe ejecutarse si se captura una excepccin del tipo // ExecptionType } catch (ExceptionType2 e) { // Cdigo que debe ejecutarse si se captura una excepccin del tipo // ExecptionType2 } catch (Exception e){ // Cdigo que debe ejecutarse si se captura una excepccin del tipo // Exception, que es el tipo ms general } finally { // Este cdigo se ejecuta siempre, pase lo que pase }

En el bloque try se coloca el cdigo cuyas posibles excepciones (errores) queremos controlar. Es decir, en este bloque se hace uso de alguna o algunas clases diseadas de forma que pueden arrojar Excepciones. En el caso de que no sucedan errores se ejecutar todo este cdigo y, finalmente, se ejecutar el cdigo encerrado en el bloque finally. Pero si en alguno de los mtodos que se llaman a partir de alguna parte del cdigo del bloque try se lanza una excepcin, entonces se rompe el flujo normal y se pasa el control al sistema de ejecucin que recorrer en orden los distintos bloques catch hasta encontrar aquel que coincida con el tipo

de excepcin que fue lanzado. Entonces se ejecutar el cdigo de dicho bloque catch y manejar la excepcin, es decir, decidir qu hacer. Por eso se denominan a los bloques catch manejadores de excepciones. Finalmente se ejecuta el bloque finally. Nota Observa que el bloque finally se ejecuta pase lo que pase, haya errores o no. Por ello se suele utilizar para cerrar y liberar recursos. No es necesario incluir un bloque finally cuando se escribe cdigo para capturar errores. El bloque finally es muy til especialmente cuando hay que liberar recursos, pero a partir de Java SE 7, existe una manera alternativa de cerrar recursos independientemente de que el cdigo arroje excepciones o no. Se trata de la sentencia try with resource. Siempre que la clase cuyas excepciones queremos controlas implemente la interfaz java.lang.AutoCloseable, podemos usar esa sentencia para asegurarnos de que el recurso se cierre pase. El cdigo siguiente muestra un ejemplo de cmo se hace.
static String readFirstLineFromFile(String path) throws IOException { try (BufferedReader br = new BufferedReader(new FileReader(path))) { return br.readLine(); } }

La clase BufferedReader implementa la interfaz java.lang.AutoCloseable (puedes comprobarlo consultando la API standard de Java). Entonces se declara el objeto AutoCloseable entre parntesis en la sentencia try. Por lo dems se trata de un bloque try como cualquier otro, en el que podemos utilizar el recurso que hemos declarado (br). Esta construccin nos asegura que el recurso br ser cerrado pase lo que pase.

BIBLIOGRAFA:

tecn.upf.es(exceptions.pdf) juandarodriguez.es (excepciones.html) profesor.gmendez(docsTema5-Excepciones.pdf) cursos.java(cursoJava_8.pdf)

You might also like