Professional Documents
Culture Documents
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.
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
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
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.
catch (InvalidIndexException e) { . . . }
catch (ArrayException e) { . . . }
catch (Exception e) { . . . }
Listado 3 Ejemplos de Manejo de Excepciones
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.*;
return buf.toString();
} }
Listado 4 InputFile.java No atiende excepciones.
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 String getWord() throws IOException { int c; StringBuffer buf = new StringBuffer();
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.
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
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.
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"); } } } }
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(); } }