You are on page 1of 10

Universidad Autnoma de Baja California Facultad de Ingeniera Apuntes de Programacin Orientada a Objetos I

Manejo de Excepciones
Una excepcin en java es un evento que ocurre durante la ejecucin de un programa que interrumpe el flujo normal de las instrucciones. Una excepcin puede ser causada por fallas de hardware o por errores sencillos de programacin como tratar de acceder a un elemento inexistente de un arreglo. Cuando dentro de un mtodo de Java ocurre un error, como los que se describieron anteriormente, el mtodo crea un objeto tipo excepcin y se lo entrega al sistema de ejecucin. Este objeto de excepcin contiene informacin sobre la excepcin como lo es su tipo y el estado del programa cuando ocurri el error. En Java se dice que sto es lanzar una excepcin. Una vez que un mtodo lanz una excepcin, el sistema de ejecucin se encarga de encontrar un mtodo manejador de excepciones para atender la excepcin. El conjunto de mtodos que posiblemente podrn atender a la excepcin son aquellos que estan en la pila de llamadas a mtodos en el momento en que se present la excepcin. El sistema de ejecucin realiza su busqueda desde el mtodo mas reciente hasta llegar al mas antiguo. El manejador de excepciones buscado es aquel que sea del mismo tipo que la excepcin. Cuando se selecciona un manejador se dice que se ha atrapado la excepcin. Si se recorren todos los mtodos en la pila y no se encuentra un manejador apropiado, entonces el programa terminar.

Ventajas de Utilizar Excepciones Separar el Cdigo de Manejador de Errores


La forma tradicional de atender condiciones de error mezcla el cdigo del programa con el cdigo utilizado para manejar errores. Esto provoca que se dificulte la lectura del cdigo principal. El sistema de excepciones de Java permiten separar claramente los dos tipos de cdigo incrementando la legibilidad del programa. El Listado 1 contiene pseudocdigo que ejemplifica el uso de excepciones para atrapar errores que pueden presentarse al leer un archivo.

1 de 10 Elaborado por: M.C. Cecilia M. Curlango Rosas

Universidad Autnoma de Baja California Facultad de Ingeniera Apuntes de Programacin Orientada a Objetos I

leerArchivo { try { abrir el archivo calcular tamao asignar memoria leer el archivo cerrar el archivo } catch (noAbrioArchivo) { hacer algo } catch (noCalculoTamao) { hacer algo } catch (noAsignoMemoria) { hacer algo } catch (noLeyo) { hacer algo } catch (noCerroArchivo) { hacer algo } }
Listado 1 Ejemplo de Manejo de Errores con Excepciones

Propagacin de Errores en la Pila de Llamadas a Mtodos


Otra ventaja del sistema de excepciones es la capacidad para propagar el reporte de un error por la pila de llamadas a mtodos. De esta manera, si a un mtodo no le interesa atender un error, permite que el error le llegue al mtodo que si lo atender. El Listado 2 ejemplifica la forma de estructurar mtodos para que permita la propagacin de errores.

2 de 10 Elaborado por: M.C. Cecilia M. Curlango Rosas

Universidad Autnoma de Baja California Facultad de Ingeniera Apuntes de Programacin Orientada a Objetos I

mtodo1 { try { llamar al mtodo2 } catch (excepcin) { procesar error } } mtodo2 throws excepcin { llamar al mtodo3 } mtodo3 throws excepcin { hacer algo que provoque error }
Listado 2 Propagacin de Errores

Agrupacin de Tipos de Errores y Distinccin entre Errores


Las excepciones en Java deben ser tipo Throwable o derivadas de esta clase. Es posible atrapar excepciones especificas, esto es especificando el nombre de la excepcin o de manera mas general atrapando la clase de la que se deriva la excepcin. La Figura 1 muestra un ejemplo de una jerarqua de clases de excepciones. En sta se muestra que la clase ArrayException se deriva de Exception y que contiene excepciones para atender los casos en los que se utilice un nmero de elemento no valido o que no se encuentre el elemento o que el tipo del elemento no sea el apropiado. El Listado 3 muestra tres ejemplos de como pueden atenderse excepciones ya se especificando directamente el nombre de la excepcin o de manera mas general especificando una excepcin de mayor jerarqua o finalmente especificando una excepcin genrica. Este ltimo mtodo no es recomendable para todas las excepciones debido a que atrapara 3 de 10 Elaborado por: M.C. Cecilia M. Curlango Rosas

Universidad Autnoma de Baja California Facultad de Ingeniera Apuntes de Programacin Orientada a Objetos I demasiadas excepciones lo cual podra provocar mas errores. En los tres casos, el parmetro e se puede utilizar para saber exactamente que tipo de excepcin occurri.

Figura 1 Jerarqua de Clases de Excepcin

catch (InvalidIndexException e) { . . . }

catch (ArrayException e) { . . . }

catch (Exception e) { . . . }
Listado 3 Ejemplos de Manejo de Excepciones

Ejemplo de Manejo de Excepciones


El Listado 4 es un archivo de programa que no compila debido a que emplea dos mtodos que pueden generar excepciones pero no tiene una forma de atenderlas. El Listado 5 list muestra una forma de corregir el programa para que si sea posible compilarlo.

4 de 10 Elaborado por: M.C. Cecilia M. Curlango Rosas

Universidad Autnoma de Baja California Facultad de Ingeniera Apuntes de Programacin Orientada a Objetos I
// Note: This class won't compile by design! // See InputFileDeclared.java for a version of this // class that will compile. import java.io.*;

public class InputFile {

private FileReader in;

public InputFile(String filename) { in = new FileReader(filename); }

public String getWord() { int c; StringBuffer buf = new StringBuffer();

do { c = in.read(); if (Character.isWhitespace((char)c)) return buf.toString(); else buf.append((char)c); } while (c != -1);

return buf.toString();

} }
Listado 4 InputFile.java No atiende excepciones.

5 de 10 Elaborado por: M.C. Cecilia M. Curlango Rosas

Universidad Autnoma de Baja California Facultad de Ingeniera Apuntes de Programacin Orientada a Objetos I

Excepciones Verificadas
Java tiene distintos tipos de excepciones. Entre ellas estn excepciones de E/S,
import java.io.*;

public class InputFileDeclared {

private FileReader in;

public InputFileDeclared(String filename) throws FileNotFoundException { in = new FileReader(filename); }

public String getWord() throws IOException { int c; StringBuffer buf = new StringBuffer();

do { c = in.read(); if (Character.isWhitespace((char)c)) return buf.toString(); else buf.append((char)c); } while (c != -1);

return buf.toString(); } } Listado 5 Manejo de excepciones correctas.

6 de 10 Elaborado por: M.C. Cecilia M. Curlango Rosas

Universidad Autnoma de Baja California Facultad de Ingeniera Apuntes de Programacin Orientada a Objetos I excepciones de tiempo de ejecucin y excepciones creadas por el usuario. Las excepciones de tiempo de ejecucin pueden ocurrir en cualquier momento y pueden ser bastantes. Por esta razn, el compilador no tiene como requisito que se atrapen o especifiquen las excepciones de tiempo de ejecucin. Sin embargo, existe otro tipo de excepciones que son las que si son verificadas por el compilador. Estas deben ser atrapadas o especificadas para que pueda compilar.

Atrapar o Especificar
Java indica que un mtodo debe de atrapar o especificar todas las excepciones verificadas que pueden lanzarse dentro de un mtodo. Atrapar una excepcin significa que se proveer un manejador de excepciones para este tipo de excepcin. Especificar una excepcin significa que un mtodo no va a atender una excepcin por lo que deber volverla a lanzar para que la atrape un mtodo que si la atender. sto pasa a formar parte de la interfaz publica del mtodo debido a que los mtodos que lo llamen deben saber el tipo de excepcin que se lanza para poder tomar decisiones sobre lo que deber hacer.

Como Atrapar y Manejar Excepciones El bloque try


Dentro de un bloque try se deben colocar las instrucciones que pueden lanzar una excepcin. Todo bloque try deber tener al menos un bloque catch o un bloque finally.

El bloque catch
El bloque catch se especifica inmediatamente despus de un bloque try. El parmetro de un catch debe contener el tipo de la excepcin que se atrapa y el nombre de la variable que representar a la excepcin dentro del bloque catch. Por medio de esta variable se podrn acceder a los mtodos de la excepcin para obtener mayor informacin sobre ella. Un ejemplo es el mtodo

7 de 10 Elaborado por: M.C. Cecilia M. Curlango Rosas

Universidad Autnoma de Baja California Facultad de Ingeniera Apuntes de Programacin Orientada a Objetos I getMessage(). Se puede utilizar mas de un bloque catch y de esta manera atrapar distintas excepciones que puedan presentarse.

El bloque finally
El ltimo paso en la atencin a excepciones es el de proporcionar una forma para liberar recursos o cerrar archivos sin importar la excepcin que se present. El sistema de ejecucin siempre ejecuta el bloque finally sin importar lo que sucedi en el bloque try.

Ejemplo con Errores


// Note: This class won't compile by design! // See ListOfNumbersDeclared.java or ListOfNumbers.java // for a version of this class that will compile. import java.io.*; import java.util.Vector; public class ListOfNumbers { private Vector victor; private static final int size = 10; public ListOfNumbers () { victor = new Vector(size); for (int i = 0; i < size; i++) victor.addElement(new Integer(i)); } public void writeList() { PrintWriter out = new PrintWriter(new FileWriter ("OutFile.txt")); for (int i = 0; i < size; i++) out.println("Value at: " + i + " = " + victor.elementAt(i)); out.close(); } }

8 de 10 Elaborado por: M.C. Cecilia M. Curlango Rosas

Universidad Autnoma de Baja California Facultad de Ingeniera Apuntes de Programacin Orientada a Objetos I

Ejemplo Completo
import java.io.*; import java.util.Vector; public class ListOfNumbers { private Vector victor; private static final int size = 10; public ListOfNumbers () { victor = new Vector(size); for (int i = 0; i < size; i++) victor.addElement(new Integer(i)); } public void writeList() { PrintWriter out = null; try { System.out.println("Entering try statement"); out = new PrintWriter(new FileWriter("OutFile.txt")); for (int i = 0; i < size; i++) out.println("Value at: " + i + " = " + victor.elementAt (i)); } catch (ArrayIndexOutOfBoundsException e) { System.err.println("Caught ArrayIndexOutOfBoundsException: " + e.getMessage()); } catch (IOException e) { System.err.println("Caught IOException: " + e.getMessage()); } finally { if (out != null) { System.out.println("Closing PrintWriter"); out.close(); } else { System.out.println("PrintWriter not open"); } } } }

9 de 10 Elaborado por: M.C. Cecilia M. Curlango Rosas

Universidad Autnoma de Baja California Facultad de Ingeniera Apuntes de Programacin Orientada a Objetos I

Ejemplo 2
import java.io.*; import java.util.Vector; public class ListOfNumbersDeclared { private Vector victor; private static final int size = 10; public ListOfNumbersDeclared () { victor = new Vector(size); for (int i = 0; i < size; i++) victor.addElement(new Integer(i)); } public void writeList() throws IOException, ArrayIndexOutOfBoundsException { PrintWriter out = new PrintWriter(new FileWriter ("OutFile.txt")); for (int i = 0; i < size; i++) out.println("Value at: " + i + " = " + victor.elementAt(i)); out.close(); } }

10 de 10 Elaborado por: M.C. Cecilia M. Curlango Rosas