- EXCEPCIONES
Definicin.
En Java una excepcin es un error o una condicin anormal que se ha producido
durante la ejecucin de un programa. Java tiene diferentes tipos de excepciones:
excepciones de I/O, las excepciones en tiempo de ejecucin y las de su propia
creacin. Durante la compilacin solamente se detectan los errores de sintaxis,
pero el manejo de excepciones de Java permite el manipular los errores que
ocurren en tiempo de ejecucin, entre estas podemos mencionar las excepciones
aritmticas (divisin entre cero), excepciones de puntero (acceso a punteros
NULL) y excepciones de indexacin (acceso por encima o debajo de los lmites de
un vector). Algunas excepciones son fatales y causan el fin de la ejecucin del
programa. En este caso conviene terminar ordenadamente y enviar un mensaje
explicando el tipo de error que se ha producido. En otras situaciones, por ejemplo
cuando no se encuentra un archivo sobre el que se desea realizar una operacin,
el programa puede dar al usuario la oportunidad de corregir el error.
Un buen programa debe manejar correctamente la mayora de los errores que se
puedan producir, Java proporciona las siguientes herramientas para el manejo de
excepciones: try, catch, throw, throws y finally.
Ejemplos de excepciones.
Por formato
String str=" 12 ";
int numero=Integer.parseInt(str);
Si se introducen caracteres no numricos, o no se quitan los espacios en blanco al
principio y al final del string, se lanza una excepcin NumberFormatException.
El mensaje que aparece en la ventana nos indica:
El tipo de excepcin: NumberFormatException,
La funcin que la ha lanzado: Integer.parseInt() que se llama dentro de main (por
ejemplo)
El compilador se queja con el siguiente mensaje variable str might not have been
initilized. En otras ocasiones, se lanza una excepcin del tipo
NulPointerException.
class MiCanvas....{
Grafico grafico;
public void paint(...){
grafico.dibuja();
//...
}
//...
}
TIPOS DE EXCEPCIONES.
Existen varios tipos fundamentales de excepciones:
Error: Excepciones que indican problemas muy graves, que suelen ser no
recuperables y no deben casi nunca ser capturadas.
4
5
try {
6
System.out.print("Valor: ");
7
int Valor = Teclado.Lee_int();
8
float Auxiliar = 8/Valor;
9
System.out.println(Auxiliar);
10
}
11
12
catch (ArithmeticException e) {
13
System.out.println("Division por cero");
14
}
15
16
System.out.println("Despues del catch");
17
18
} while (true);
19 }
20 }
Al ejecutar el programa e introducir diversos valores, obtenemos la siguiente
salida:
SINTAXIS
try {
// instrucciones susceptibles de causar cierto tipo de excepciones
}
catch (TipoDeExcepcion1 Identificador) {
// instrucciones que se deben ejecutar si ocurre la excepcion de tipo
TipoDeExcepcion1
}
catch (TipoDeExcepcion2 Identificador) {
// instrucciones que se deben ejecutar si ocurre la excepcion de tipo
TipoDeExcepcion2
}
................
catch (TipoDeExcepcionN Identificador) {
// instrucciones que se deben ejecutar si ocurre la excepcion de tipo
TipoDeExcepcionN
}
nicamente las instrucciones del bloque catch que cumple los requisitos (si es
que alguno los cumple).
De esta manera sera correcto implementar la secuencia:
try {
// instrucciones susceptibles de causar cierto tipo de excepciones
}
catch (NullPointerException e) {
// instrucciones que se deben ejecutar si ocurre la excepcion de tipo
NullPointerException
}
catch (RuntimeException e) {
// instrucciones que se deben ejecutar si ocurre la excepcion de tipo
RunTimeException
}
catch (Exception e) {
// instrucciones que se deben ejecutar si ocurre la excepcion de tipo Exception
}
Como se puede comprobar, las instrucciones del bloque try pueden generar, al
menos, dos excepciones: ArithmeticException e IndexOutOfBoundsException. Si
introducimos un ndice ( Posicin) mayor que 4 (el vector abarca de 0 a 4) nos
encontramos con una excepcin del segundo tipo, mientras que si introducimos
como denominador (valor) un cero, nos encontramos con una excepcin
aritmtica.
PROPAGACION DE EXCEPCIONES
Las instrucciones que tenemos dentro de un bloque try a menudo contienen
llamadas a mtodos que a su vez pueden realizar llamadas a otros mtodos y as
sucesivamente. Cualquiera de los mtodos llamados puede provocar una
excepcin y cualquiera de los mtodos puede, o no, tratarla (con bloques catch).
Una excepcin no tratada en un bloque se propaga hacia el bloque llamante. Este
mecanismo de propagacin contina mientras no se trate la excepcin o se llegue
al mtodo de nivel superior. Si la excepcin no se trata en el mtodo de nivel
superior, se imprime un mensaje de error por consola.
GESTIN DE EXCEPCIONES:
MANEJO DE EXCEPCIONES, LANZAMIENTO DE EXCEPCIONES.
Lanzamiento de excepciones:
Muchas veces el programador dentro de un determinado mtodo deber
comprobar si alguna condicin de excepcin se cumple, y si es as lanzarla. Para
ello se utilizan las palabras reservadas throw y throws. Por una parte la excepcin
se lanza mediante la sentencia throw:
if ( condicion_de_excepcion == true )
throw new miExcepcion();
Se puede observar que hemos creado un objeto de la clase miExcepcion, puesto
que las excepciones son objetos y por tanto debern ser instanciadas antes de ser
lanzadas.Aquellos mtodos que pueden lanzar excepciones, deben cules son
esas excepciones en su declaracin. Para ello se utiliza la sentencia throws:
tipo_devuelto miMetodoLanzador() throws miExcep1, miExcep2 {
// Codigo capaz de lanzar excepciones miExcep1 y miExcep2
}
Se puede observar que cuando se pueden lanzar en el mtodo ms de una
excepcin se deben indicar en sus declaraciones separadas por comas.
Ejemplo de gestin de excepciones
Ahora que ya sabemos cmo funciona este sistema, conviene ver al menos un
pequeo ejemplo, que ilustre al lector en el uso de las excepciones:
// Creo una excepcin personalizada
class MiExcepcion extends Exception {
MiExcepcion(){
super(); // constructor por defecto de Exception
}
MiExcepcion( String cadena ){
super( cadena ); // constructor param. de Exception
}
}
// Esta clase lanzar la excepcin
class Lanzadora {
void lanzaSiNegativo( int param ) throws MiExcepcion {
if ( param < 0 )
throw new MiExcepcion( "Numero negativo" );
}
}
class Excepciones {
public static void main( String[] args ) {
// Para leer un fichero
11 }
UTILIZACIN
11
}
12
while(true);
13
}
14 }
EJEMPLO
En los apartados anteriores hemos definido y utilizado una excepcin con sus
constructores bsicos, pero sin propiedades ni mtodos adicionales. En ocasiones
con el esquema seguido es suficiente, sin embargo, a menudo es adecuado dotar
de un estado (propiedades) a la clase que define la excepcin. Veamos este
concepto con un ejemplo sencillo: deseamos programar la introduccin por teclado
de matrculas de vehculos en un pas donde las matrculas se componen de 8
caracteres, siendo obligatoriamente el primero de ellos una letra. Si alguna
matrcula introducida por el usuario no sigue el formato esperado se recoger la
interrupcin oportuna y se escribir un aviso en la consola.
Una vez creada la excepcin ExMatricula podemos escribir el cdigo que valida
las matrculas. La siguiente clase (ExMatriculaValidar) realiza este cometido: el
mtodo Validar situado en la lnea 7 comprueba el formato del parmetro
suministrado y si es necesario tendr capacidad de levantar ( throws) la excepcin
ExMatricula.
Si la longitud de la matrcula es distinta de 8 caracteres (lnea 8) se crea y levanta
la excepcin ExMatricula con estado inicial ExMatricula.MAL_TAMANIO (lnea 9).
Si el carcter inicial no es una letra (lnea 11) se crea y levanta la excepcin
ExMatricula con estado inicial ExMatricula.MAL_LETRA (lnea 12).
El mtodo privado (slo es visible en esta clase) UnaLetra asla el primer carcter
y comprueba que es una letra empleando el mtodo matches y la expresin
regular [A-Za-z]. La utilizacin de expresiones regulares se incluye a partir de la
versin 1.4 del JDK.
1 public class ExMatriculaValidar {
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
16
17
18
19
20
21
22
23
24
25
26
27 }
break;
case ExMatricula.MAL_LETRA:
System.out.println("Letra inicial no
incluida");
break;
default:
System.out.println("Matricula correcta");
break;
}
}
while(true);
}