Fecha de elaboracin: 7 de Marzo del 2007 Guadalajara, Jalisco, Mxico
Autor Mtro. Ignacio Robles Fecha de Elaboracin 7 de Marzo del 2007 Lugar de Elaboracin Guadalajara, Jalisco Actualizacin Julio 2011 Mtro. Carlos de Jesus Martinez Cardozo Referencias bibliogrficas 1. Booch, Grady, Anlisis y diseo orientado a objetos.Adison-Wesley, 2da. Edicin 2. Deitel, Java How to Program (6th Edition)-Prentice-Hall 3. Pressman,R.S. SOFTWARE ENGINEERING: A PRACTITIONER'S APPROACH. McGraw-Hill, Sixth Edition
Unidad 4 Excepciones
2 Elaborado por: Mtro. Ignacio Robles Fecha de elaboracin: 7 de Marzo del 2007 Guadalajara, Jalisco, Mxico
Excepciones
Cuando uno maneja, en lo que menos se piensa es en chocar, o qu persona se casa pensando en divorciarse? En la mayora de los casos, se tiende a pensar en el caso ideal, es decir, en que se sigue al pie de la letra un procedimiento o un mtodo de manera predecible. Sin embargo, durante esa secuencia pueden surgir imprevistos o eventos esperados, mas no deseados. Por ejemplo, que no exista conexin al proveedor de Internet, que no exista un archivo, etc.
Tales eventos se les conocen como excepciones.
3 Elaborado por: Mtro. Ignacio Robles Fecha de elaboracin: 7 de Marzo del 2007 Guadalajara, Jalisco, Mxico
Excepciones (...) Una excepcines un evento que ocurre cuando las condiciones tales como valores de variables, disponibilidad de recursos o la misma existencia de objetos, no satisfacen una secuencia de ejecucin.
Todo programador entonces debe contemplar el caso ideal y las contingencias necesarias para corregir el rumbo.
4 Elaborado por: Mtro. Ignacio Robles Fecha de elaboracin: 7 de Marzo del 2007 Guadalajara, Jalisco, Mxico
Excepciones (...)
5 Elaborado por: Mtro. Ignacio Robles Fecha de elaboracin: 7 de Marzo del 2007 Guadalajara, Jalisco, Mxico
Definicin de excepciones
public class MiExcepcion extends Exception{
public MiExcepcion() { super("Esta es una excepcin provocada"); } } Una excepcin en Java es cualquier objeto de clase java.lang.Exception o subclase de la misma (si el programador desea crear sus propias excepciones deber entonces crear subclases de la clase mencionada).
6 Elaborado por: Mtro. Ignacio Robles Fecha de elaboracin: 7 de Marzo del 2007 Guadalajara, Jalisco, Mxico
Generacin de excepciones Para generar una excepcin es necesario crear la instancia de la subclase de Exceptiony arrojrselo a la mquina virtual o a una instancia.
Ejemplo: throw instancia; Throw new MiExcepcion();
7 Elaborado por: Mtro. Ignacio Robles Fecha de elaboracin: 7 de Marzo del 2007 Guadalajara, Jalisco, Mxico
Captura de excepciones Sin embargo, cuando se ocurri una excepcin el programador es responsable de cachar o capturar la excepcin, de lo contrario, la mquina virtual que no admite responsabilidad alguna, romper la ejecucin del cdigo. Para capturar una excepcin se utiliza la sentencia try-catch.
8 Elaborado por: Mtro. Ignacio Robles Fecha de elaboracin: 7 de Marzo del 2007 Guadalajara, Jalisco, Mxico
Captura de excepciones (...)
Ejemplo:
try{ //Cdigo crtico throw new MiExcepcion(); } catch(MiExcepcionex) { //Cdigo emergente System.out.println("Uuups! Ocurri el error " + ex.getMessage()); }
9 Elaborado por: Mtro. Ignacio Robles Fecha de elaboracin: 7 de Marzo del 2007 Guadalajara, Jalisco, Mxico
Captura de excepciones (...)
Random rnd = new Random(); int divisor = rnd.nextInt(2); System.out.println("5/" + divisor + " = " + ((double) (5/divisor)));
Esto pudiera generar el resultado: java.lang.ArithmeticException: / by zero Otro caso es la divisin entre cero. Suponga el cdigo siguiente:
10 Elaborado por: Mtro. Ignacio Robles Fecha de elaboracin: 7 de Marzo del 2007 Guadalajara, Jalisco, Mxico
Captura de excepciones (...)
try{ Random rnd = new Random(); int divisor = rnd.nextInt(2);
System.out.println("5/" + divisor + " = " + ( (double) (5 / divisor))); } catch(ArithmeticExceptionex) { System.err.println("Ocurri una divisin entre 0"); } Es necesario proteger este cdigo por medio del try-catch.
11 Elaborado por: Mtro. Ignacio Robles Fecha de elaboracin: 7 de Marzo del 2007 Guadalajara, Jalisco, Mxico
Captura de excepciones (...) Una segunda versin de este cdigo implica convertir la cadena dad como parmetro a un entero y utilizarlo como dividendo. Sin embargo, la conversin de cadena a entero implica que la cadena contenga una literal vlida, de lo contrario se genera una excepcin.
int dividendo = 0; try { dividendo = Integer.parseInt(args[0]); } catch (NumberFormatExceptionex) { System.err.println("'" + args[0] + "' no es un nmero vlido"); System.exit(1); }
12 Elaborado por: Mtro. Ignacio Robles Fecha de elaboracin: 7 de Marzo del 2007 Guadalajara, Jalisco, Mxico
Captura de excepciones (...) int divisor = (new Random()).nextInt(2);
13 Elaborado por: Mtro. Ignacio Robles Fecha de elaboracin: 7 de Marzo del 2007 Guadalajara, Jalisco, Mxico
Captura mltiple de excepciones
Si un bloque de cdigo puede generar diversas excepciones, es posible asignar un segmento catchpara cada tipo de excepcin. Para el ejemplo anterior:
try { int dividendo = 0; dividendo = Integer.parseInt(args[0]); int divisor = (new Random()).nextInt(2); System.out.println(dividendo + "/" + divisor + "= " + ((double) dividendo/divisor));
} catch (NumberFormatExceptionex) { System.err.println(No es un nmero vlido"); System.exit(1); } catch (ArithmeticExceptionex) { System.err.println(Error, divisin entre cero); }
14 Elaborado por: Mtro. Ignacio Robles Fecha de elaboracin: 7 de Marzo del 2007 Guadalajara, Jalisco, Mxico
Captura nica de excepciones
Si no se desea hacer distincin de excepciones para tratarlos de forma independiente, pudiera declararse un solo segmento catchpara capturar cualquier tipo de excepcin. Dado que toda excepcin es una subclase de Exceptionentonces, para el ejemplo anterior
try { int dividendo = 0; dividendo = Integer.parseInt(args[0]); int divisor = (new Random()).nextInt(2); System.out.println(dividendo + "/" + divisor + "= " + ((double) dividendo/divisor));
15 Elaborado por: Mtro. Ignacio Robles Fecha de elaboracin: 7 de Marzo del 2007 Guadalajara, Jalisco, Mxico
try/ catch / finally Existen situaciones donde es necesario ejecutar un cdigo de terminacin independientemente de si ocurri una excepcin o no. Por ejemplo, el caso de la apertura de base de datos.
try { Abrir la base de datos Extraer datos Generar reporte } catch (Exception1 ex) { No se pudo abrir la base de datos } finally{ Destruir y cerrar los recursos de la base de datos }
16 Elaborado por: Mtro. Ignacio Robles Fecha de elaboracin: 7 de Marzo del 2007 Guadalajara, Jalisco, Mxico
try/ catch / finally(...) El segmento finallyse ejecuta en los siguientes casos: Cuando el segmento trytermina satisfactoriamente Cuando el segmento catchtermina de ejecutarse despus de capturar la excepcin
Como se aprecia, el segmento se ejecuta siempre.
17 Elaborado por: Mtro. Ignacio Robles Fecha de elaboracin: 7 de Marzo del 2007 Guadalajara, Jalisco, Mxico
try/ catch / finally(...)
int[] arreglo; ... int dameElementoEnLaPosicion(int i) {
int valor; try { valor = arreglo[i]; } catch (ArrayIndexOutOfBoundsException ex) { valor = -1; } finally { return valor; } }
18 Elaborado por: Mtro. Ignacio Robles Fecha de elaboracin: 7 de Marzo del 2007 Guadalajara, Jalisco, Mxico
Propagacin de excepciones Ya se mencion que el programador es responsable de capturar excepciones. Sin embargo, es posible definir qu porcin de cdigo se har cargo de la excepcin.
Esto se conoce como propagacin de excepciones.
19 Elaborado por: Mtro. Ignacio Robles Fecha de elaboracin: 7 de Marzo del 2007 Guadalajara, Jalisco, Mxico
Propagacin de excepciones (...) Por ejemplo, el caso de un validador de contrasea. Una forma de validacin estara determinada por el mtodo siguiente:
public boolean validaContrasea1(String passwd) { return this.passwd.equals(passwd); }
Este estilo puede ser considerado como tradicional.
20 Elaborado por: Mtro. Ignacio Robles Fecha de elaboracin: 7 de Marzo del 2007 Guadalajara, Jalisco, Mxico
Propagacin de excepciones (...)
Otra forma, es mediante la propagacin de excepciones. Para lo cual definiremos la siguiente excepcin:
public class ContraseaInvalida extends Exception{
public ContraseaInvalida(String passwd) { super("La contrasea '" +passwd+ "' es invlida"); } }
21 Elaborado por: Mtro. Ignacio Robles Fecha de elaboracin: 7 de Marzo del 2007 Guadalajara, Jalisco, Mxico
Propagacin de excepciones (...) Un mtodo clsico de propagacin de excepciones sera:
public void validaContrasea2(String passwd) throws ContraseaInvalida{ if(!this.passwd.equals(passwd)) throw new ContraseaInvalida(passwd); }
Esto significa que el mtodo es cdigo crtico, por lo cual, deber tratarse en un bloque try-catch.
22 Elaborado por: Mtro. Ignacio Robles Fecha de elaboracin: 7 de Marzo del 2007 Guadalajara, Jalisco, Mxico
Propagacin de excepciones (...)
ValidadorContrasea validador = new ValidadorContrasea();
try { String passwd = args[0];
if (validador.validaContrasea1(passwd)) { System.out.println("Contrasea correcta validada por validaContrasea1"); } else System.out.println("Contrasea incorrecta validada por validaContrasea1");
23 Elaborado por: Mtro. Ignacio Robles Fecha de elaboracin: 7 de Marzo del 2007 Guadalajara, Jalisco, Mxico
Propagacin de excepciones (...)
//El mtodo es susceptible a excepcin validador.validaContrasea2(passwd); System.out.println("Contrasea incorrecta validada por validaContrasea2"); } catch (ArrayIndexOutOfBoundsException ex) { System.out.println("Forma de uso: java ValidadorContrasea <passwd>"); } catch (ContraseaInvalidaex) { System.out.println("Contrasea incorrecta validada por validaContrasea2"); }