Está en la página 1de 23

1

Elaborado por: Mtro. Ignacio Robles


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.

try{
cdigo susceptible a generar excepcin
} catch(NombreClaseExcepcininstancia) {
cdigo emergente
}

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);

try {
System.out.println(dividendo + "/" + divisor + "=" + ((double) dividendo/divisor));
} catch (ArithmeticException ex) {
System.err.println("Error: " + ex.getMessage());
}


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));

} catch (Exceptionex) {
System.err.println(Ha ocurrido un error + ex.getMessage());
System.exit(1);
}

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");
}