Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Capítulo 6 : EXCEPCIONES.
Objetivos:
Al término del capítulo, será capaz de:
Definir las excepciones.
Explicar por qué es importante el manejo de las excepciones.
Escribir código para capturar excepciones.
Crear sus propias excepciones.
Excepciones.
¿Qué es una excepción?. En Java, la clase Exception define condiciones leves de error que los programas se
pueden encontrar. En lugar de permitir que un programa termine, se puede escribir código para manejar las
excepciones y continuar la ejecución del programa.
¿Qué es un error?. La clase Error define lo que se consideran condiciones graves de error y de las que no se debe
intentar una recuperación. En la mayoría de los casos, es recomendable permitir que un programa termine si se
encuentra un error.
Java implanta las excepciones al estilo de C++ para ayudar a construir código flexible. Cuando un error ocurre en un
programa, el código que encuentra un error puede lanzar una excepción. El lanzamiento de una excepción es el
proceso de señalarle al proceso actual que ha ocurrido un problema. Después, se puede capturar la excepción lanzada
y cuando sea posible, recuperarse de ella.
Considérese una extensión sencilla de la versión del programa HolaMundo.java (el cual se cicla con mensajes):
public class HolaMundo{
public static void main(String args[]){
int i = 0;
String saludos[] = {"Hola mundo!","No,lo siento!","HOLA MUNDO!"};
while(i < 4){
System.out.println(saludos[i]);
i++;
}
}
}
Manejo de excepciones.
Normalmente, un programa termina con un mensaje de error cuando se lanza una excepción, como lo hace el
ejemplo anterior, después de ejecutarse cuatro veces el ciclo.
java HolaMundo
Hola mundo!
No, lo siento!
HOLA MUNDO!!
java.lang.ArrayIndexOutOfBoundsException: 3
at HolaMundo.main(HolaMundo.java:12)
Sin embargo, la importancia del manejo de una excepción es que se pueda codificar el programa para atrapar
excepciones, manipularlas y luego continuar la ejecución del programa. Java posee herramientas que le permiten
considerar que excepción se lanzó y luego intentar la recuperación.
M. I. Alejandro Cifuentes A. 1
CUGS Programación Avanzada
El enunciado finally.
El enunciado finally define un bloque de código que siempre se pretende utilizar, considerando que se capture, o no,
una excepción. El siguiente código de muestra es tomado de los apuntes de Frank Yellin, "El bajo nivel de seguridad
en Java":
try{
iniciaRiego();
regadera();
}
finally{
paraRiego();
}
Java garantiza que el riego se detiene, aún si ocurre una excepción mientras se inicia el riego del césped. El código
entre llaves, después de try, se llama código protegido.
La única vez en que el enunciado finally no se ejecutaría, es cuando el método System.exit() se ejecuta
dentro del código protegido.
Ejemplo.
El siguiente ejemplo es una versión de HolaMundo.
La excepción generada en la primera versión del programa se captura y el índice del arreglo es puesto a 0.
public static void main(String args[]){
int i = 0;
String saludos[] = {"Hola mundo!!, "No, lo siento!", "HOLA MUNDO!!"};
while(i < 4){
try{
System.out.println(saludos[i]);
}
catch(ArrayIndexOutOfBoundsException e){
System.out.println("Reasignando el valor del índice");
i = -1;
}
catch(Exception e){
System.out.println(e.toString());
}
finally{
System.out.println("Esto siempre se despliega");
}
i++;
} //FIN DEL while().
} //FIN DE main().
M. I. Alejandro Cifuentes A. 2
CUGS Programación Avanzada
Categorías de excepciones.
En Java, existen tres amplias categorías de excepciones.
Se define la clase java.lang.Throwable, que actúa como la clase padre para todos los objetos que puedan ser
lanzados y capturados, utilizando los mecanismos de manejo de excepciones.
Exception Error
RuntimeException
La clase Throwable no se utiliza; en su lugar, se utiliza una de las otras tres para describir cualquier excepción en
particular. El propósito de cada una es:
Error indica la existencia de un error severo del cual es difícil, si no imposible, recuperarse. Un ejemplo es la
corrida fuera de memoria. Se espera que un programa no maneje tales condiciones, a pesar de que posiblemente
se hiciera con cuidado.
RuntimeException se debe utilizar para indicar un problema de diseño o implantación. Esto es, debe
indicar, durante la ejecución, condiciones que nunca deberían suceder si el programa se opera apropiadamente.
Esto se aplicaría, por ejemplo, al desborde de los índices del arreglo y a la liberación de una variable nula de
objeto. Debido a que un programa bien diseñado e implantado nunca emite este tipo de excepción, es usual no
manejarla. Esto produce un mensaje en tiempo de corrida y asegura cuales acciones se pueden tomar para
corregir el problema, en lugar de esconderlo en donde nadie lo notará.
Otras excepciones indican la ocurrencia de una dificultad en tiempo de corrida debido a los efectos ambientales,
y se pueden manejar. Por ejemplo, las excepciones del tipo file not found o malformed URL, pueden
ocurrir fácilmente si el usuario introduce algo equivocado. Dado que estos errores ocurren debido al usuario, se
sugiere que los maneje el programador.
Excepciones comunes.
Java proporciona varias excepciones predefinidas. Las siguientes son excepciones comúnmente encontradas:
ArithmeticException El resultado típico de una operación al dividir enteros por cero:
int i = 12 / 0;
NullPointerException Un intento de accesar un objeto o un método antes de ser instanciado:
Image im[] = new Image[4];
System.out.println( im[0].toString() );
NegativeArraySizeException Un intento de crear un arreglo con una dimensión negativa.
ArrayIndexOutOfBoundsException Un intento de accesar un elemento de un arreglo mas allá de la
definición original del tamaño del arreglo.
SecurityException Típicamente lanzada en un navegador, la clase SecurityManager lanza una
excepción para los applets que intenten:
M. I. Alejandro Cifuentes A. 3
CUGS Programación Avanzada
Hay dos cosas que el programador puede hacer para satisfacer esto: Lo primero es utilizar un bloque try{} catch()
{}, donde catch nombra cualquier superclase de la excepción lanzada para manejar la situación, inclusive si el
bloque catch se encuentra vacío.
Lo segundo es indicar que la excepción no se maneje en este método, y que por consiguiente será lanzada hacia el
método que realiza la llamada. Esto se logra marcando la declaración del método con una cláusula throws, de la
siguiente forma:
public void algúnProblema() throws IOException
Enseguida de la palabra throws, se escribe una lista de todas las excepciones que pudieran surgir dentro del
método, pero que no se manejan ahí. Aunque aquí solo se muestra una excepción, se puede utilizar una lista separada
con comas, si es que existen excepciones múltiples que no se manejan en el método.
Para lanzar una excepción que se haya creado, se utiliza la siguiente sintaxis:
throw new ServerTimedOutException("No se pudo conectar", 80);
Ejemplo.
Considere un programa cliente-servidor. En el código cliente, se pretende conectar al servidor y espera que éste
responda en unos cinco segundos. Si el servidor no responde, el código podría lanzar una excepción (alguna similar a
ServerTimedOutException definida por el usuario), como la siguiente:
public void conectame(String nombreDeServidor) throws ServerTimedOutException{
int exito;
int puertoParaConectarse = 80;
exito = open(nombreDelServidor, puertoParaConectarse);
if(exito == -1){
throw new ServerTimedOutException("No se pudo conectar", 80);
}
}
M. I. Alejandro Cifuentes A. 4
CUGS Programación Avanzada
try{
conectame(servidorAlterno);
}
catch(ServerTimedOutException e1){
g.drawString(Servidor disponible actualmente", 5, 5);
}
}
. . .
Ejercicios.
1. Manejo de una excepción.
Utilice el programa HolaMundo.java para lanzar una excepción cuando el índice exceda el tamaño del
arreglo. Utilice los enunciados try y catch para recuperarse de la excepción.
M. I. Alejandro Cifuentes A. 5