You are on page 1of 10

NOTAS DE CLASE PROGRAMACIN ORIENTADA A OBJETOS

USO DE EXCEPCIONES EN JAVA

El tratamiento de los errores es uno de los problemas ms importantes al escribir programas en cualquier lenguaje. Las excepciones de
Java hacen referencia a este hecho. Se denomina excepcin a una situacin que no se puede resolver y que provoca la detencin del
programa; es decir una condicin de error en tiempo de ejecucin.

Ejemplos:

1. El archivo que queremos abrir no existe.


2. Falla la conexin a una red.
3. La clase que se desea utilizar no se encuentra en ninguno de los paquetes reseados con import.
4. Una divisin entre cero.

Los errores de sintaxis son detectados durante la compilacin. Pero las excepciones pueden provocar situaciones irreversibles, su control
debe hacerse en tiempo de ejecucin y eso presenta un gran problema. En Java se puede preparar el cdigo susceptible a provocar errores
de ejecucin de modo que si ocurre una excepcin, el cdigo es lanzado (throw) a una determinada rutina previamente preparada por
el programador, que permite manipular esa excepcin. Si la excepcin no fuera capturada, la ejecucin del programa se detendra
irremediablemente.

En Java hay muchos tipos de excepciones (de operaciones de entrada y salida, de operaciones irreales. El paquete java.lang.Exception
y sus subpaquetes contienen todos los tipos de excepciones.

Cuando se produce un error se genera un objeto asociado a esa excepcin. Este objeto es de la clase Exception o de alguna de sus
herederas. Este objeto se pasa al cdigo que se ha definido para manejar la excepcin. Dicho cdigo puede manipular las propiedades
del objeto Exception.

Hay una clase, la java.lang.Error y sus subclases que sirven para definir los errores irrecuperables ms serios. Esos errores causan
parada en el programa, por lo que el programador no hace falta que los manipule. Estos errores los produce el sistema y son incontrolables
para el programador. Las excepciones son fallos ms leves, y ms manipulables.

try y catch Son las sentencias que tratan las excepciones.

Sintaxis
try {
Instrucciones que se ejecutan salvo que haya un error

}catch (ClaseException objetoQueCapturaLaExcepcin){


Instrucciones que se ejecutan si hay un error

Puede haber ms de una sentencia catch para un mismo bloque try

try {
readFromFile(arch);
...
}
catch(FileNotFoundException e) {
//archivo no encontrado
...
}
catch (IOException e) {
...
}

Dentro del bloque try se colocan las instrucciones susceptibles de provocar una excepcin, el bloque catch sirve para capturar esa
excepcin y evitar el fin de la ejecucin del programa.

Cada catch maneja un tipo de excepcin. Cuando se produce una excepcin, se busca el catch que posea el manejador de excepcin
adecuado, ser el que utilice el mismo tipo de excepcin que se ha producido. Esto puede causar problemas si no se tiene cuidado, ya
NOTAS DE CLASE PROGRAMACIN ORIENTADA A OBJETOS
USO DE EXCEPCIONES EN JAVA

que la clase Exception es la superclase de todas las dems. Por lo que si se produjo, por ejemplo, una excepcin de tipo
AritmethicException y el primer catch captura el tipo genrico Exception, ser ese catch el que se ejecute y no los dems. Por eso el
ltimo catch debe ser el que capture excepciones genricas y los primeros deben ser los ms especficos. Lgicamente si vamos a
tratar a todas las excepciones (sean del tipo que sean) igual, entonces basta con un solo catch que capture objetos Exception.

Manejo de excepciones
Siempre se debe controlar una excepcin, de otra forma nuestro software est a merced de los fallos. En la programacin siempre ha
habido dos formas de manejar la excepcin:

Interrupcin. En este caso se asume que el programa ha encontrado un error irrecuperable. La operacin que dio lugar a la excepcin
se anula y se entiende que no hay manera de regresar al cdigo que provoc la excepcin. Es decir, la operacin que dio pies al error,
se anula.

Reanudacin. Se puede manejar el error y regresar de nuevo al cdigo que provoc el error.

La filosofa de Java es del tipo interrupcin, pero se puede intentar emular la reanudacin encerrando el bloque try en un while que se
repetir hasta que el error deje de existir. Ejemplo:

En el cdigo anterior, el ndice i calcula un nmero del 0 al 9 y con ese nmero el cdigo accede al array texto que slo contiene 5
elementos.

Esto producir muy a menudo una excepcin del tipo ArrayIndexOutOfBoundsException que es manejada por el catch
correspondiente. Normalmente no se continuara intentando. Pero como tras el bloque catch est dentro del while, se har otro intento
y as hasta que no haya excepcin, lo que provocar que indiceNovalido valga true y la salida, al fin, del while.

Como se observa en la Error! No se encuentra el origen de la referencia., la clase Exception es la superclase de todos los tipos de
excepciones. Esto permite utilizar una serie de mtodos comunes a todas las clases de excepciones:

String getMessage(). Obtiene el mensaje descriptivo de la excepcin o una indicacin especfica del error ocurrido:

try{
int a = 20;

}catch(IOException error){

System.out.println(error.getMessage());
}

String toString(). Escribe una cadena sobre la situacin de la excepcin. Suele indicar la clase de excepcin y el texto de getMessage().

void printStackTrace(). Escribe el mtodo y mensaje de la excepcin (la llamada informacin de pila). El resultado es el mismo
mensaje que muestra el ejecutor (la mquina virtual de Java) cuando no se controla la excepcin.
throws
NOTAS DE CLASE PROGRAMACIN ORIENTADA A OBJETOS
USO DE EXCEPCIONES EN JAVA

Al llamar a mtodos, ocurre un problema con las excepciones. El problema es, si el mtodo da lugar a una excepcin, quin la
maneja? El propio mtodo? O el cdigo que hizo la llamada al mtodo?

Con lo visto hasta ahora, sera el propio mtodo quien se encargara de sus excepciones, pero esto complica el cdigo. Por eso otra
posibilidad es hacer que la excepcin la maneje el cdigo que hizo la llamada.

Esto se hace aadiendo la palabra throws tras la primera lnea de un mtodo. Tras esa palabra se indica qu excepciones puede
provocar el cdigo del mtodo. Si ocurre una excepcin en el mtodo, el cdigo abandona ese mtodo y regresa al cdigo desde el que
se llam al mtodo. All se posar en el catch apropiado para esa excepcin.

Ejemplo:
void usarArchivo (String archivo) throws IOException,
InterruptedException {...

En este caso se est indicando que el mtodo usarArchivo puede provocar excepciones del tipo IOException y InterruptedException.
Esto significar, adems, que el que utilice este mtodo debe preparar el catch correspondiente para manejar los posibles errores.

Ejemplo
try{
...
objeto.usarArchivo(C:\texto.txt);
//puede haber excepcin
..
}
catch(IOException ioe){...
}
catch(InterruptedExceptionie){...
}
...
//otros catch para otras posibles excepciones

throw
Esta instruccin nos permite lanzar a nosotros nuestras propias excepciones (o lo que es lo mismo, crear artificialmente nosotros las
excepciones). Ante:

throw new Exception();

El flujo del programa se dirigir a la instruccin try/catch ms cercana. Se pueden utilizar constructores en esta llamada (el formato de
los constructores depende de la clase que se utilice):

throw new Exception(Error grave, grave);

Eso construye una excepcin con el mensaje indicado.

throw permite tambin relanzar excepciones. Esto significa que dentro de un catch podemos colocar una instruccin throw para
lanzar la nueva excepcin que ser capturada por el catch correspondiente:

try{
...
} catch(ArrayIndexOutOfBoundsException exc)
{
throw new IOException();
} catch(IOException){
...
NOTAS DE CLASE PROGRAMACIN ORIENTADA A OBJETOS
USO DE EXCEPCIONES EN JAVA

El segundo catch capturar tambin las excepciones del primer tipo

finally
La clusula finally est pensada para limpiar el cdigo en caso de excepcin. Su uso es:

try{
...
}catch (FileNotFoundException fnfe){
...
}catch(IOException ioe){
...
}catch(Exception e){
...
}finally{
...
//Instrucciones de limpieza
}

Las sentencias finally se ejecutan tras haberse ejecutado el catch correspondiente. Si ningn catch captur la excepcin, entonces se
ejecutarn esas sentencias antes de devolver el control al siguiente nivel o antes de romperse la ejecucin.

Hay que tener muy en cuenta que las sentencias finally se ejecutan independientemente de si hubo o no excepcin. Es decir esas
sentencias se ejecutan siempre, haya o no excepcin. Son sentencias a ejecutarse en todo momento. Por ello se coloca en el bloque
finally cdigo comn para todas las excepciones y tambin para cuando no hay excepciones.

Tipo de excepciones

Excepcin Tipo
ArithmeticException Excepcin de tipo aritmtico
NullPointerException Acceso a un objeto null
FileNotFoundException Error al intentar abrir un archivo
Exception Excepcin de tipo diferente
IOException Error de entrada o salida (leer un archivo)
NumberFormatException Error de formato de numero
ArrayIndexOutOfBoundsException ndices invlidos en un arreglo
DivideByZeroException Divisin entre cero

Ejemplos 1
NOTAS DE CLASE PROGRAMACIN ORIENTADA A OBJETOS
USO DE EXCEPCIONES EN JAVA

El programa lee un nmero entero y lo muestra. Si en la instruccin sc.nextInt() se introduce un nmero de otro tipo o un carcter, se
lanza una excepcin InputMismatchException que es capturada por el bloque catch. En este bloque se realizan las instrucciones
necesarias para resolver la situacin y que el programa pueda continuar.

Ejemplo 2

Para el tratamiento de una excepcin: Excepcin lanzada en un mtodo y tratada en el que mtodo que lo ha llamado.

Ejemplo 3
NOTAS DE CLASE PROGRAMACIN ORIENTADA A OBJETOS
USO DE EXCEPCIONES EN JAVA

Ejemplo de tratamiento de excepciones con varios catch:

En este programa se controla el error producido si se introduce un dato no entero y si se intenta acceder a una posicin fuera del array.

El sistema de control de excepciones puede ser anidado a cualquier nivel.


Debe mantenerse la regla de que un bloque try debe ser seguido por un catch.
Pueden existir secuencias try-catch dentro de bloques try y de bloques catch.

Ejemplo 4 Ejemplo de anidamiento de bloques try-catch:

Cada catch debe tener como parmetro un objeto de la clase Throwable, de una clase derivada de ella o de una clase definida por el
programador.
NOTAS DE CLASE PROGRAMACIN ORIENTADA A OBJETOS
USO DE EXCEPCIONES EN JAVA

Cuando se lanza una excepcin se captura por el primer bloque catch cuyo parmetro sea de la misma clase que el objeto excepcin o
de una clase base directa o indirecta. Es importante el orden en que se coloquen los bloques catch.

Las excepciones ms genricas se deben capturar al final

Si no es necesario tratar excepciones concretas de forma especfica se puede poner un bloque catch de una clase base que las capture
todas y las trate de forma general. Esto se conoce como captura genrica de excepciones.

Ejemplo 5 Ejemplo de captura genrica de excepciones:

Al programa anterior le aadiremos un nuevo bloque catch con un parmetro de tipo Exception. Este bloque se debe colocar al final ya
que si se pone al principio capturara cualquiera de las otras dos excepciones sin que sus bloques catch pudieran llegar a ejecutarse
nunca.

Declarar Excepciones
La declaracin de las excepciones que puede lanzar un mtodo se realiza escribiendo la palabra throws seguida del nombre de las
excepciones separadas por comas.

Por ejemplo, la instruccin System.in.read() para leer un carcter lanza una excepcin de tipo IOException que debemos capturar o
declarar.

En este ejemplo no se captura la excepcin por lo que estamos obligados a declararla:

public static void main(String[] args) throws IOException{


char car;
System.out.println("Introduce un carcter");
car = (char)System.in.read();
}

La declaracin de excepciones permite escribir mtodos que no capturan las excepciones marcadas que se puedan producir.
Una excepcin no capturada se lanza para que la trate algn mtodo de la pila de llamadas.
NOTAS DE CLASE PROGRAMACIN ORIENTADA A OBJETOS
USO DE EXCEPCIONES EN JAVA

Lanzar Excepciones
Java permite al programador lanzar excepciones mediante la palabra reservada throw.throw objetoExcepcion; La excepcin que se
lanza es un objeto, por lo que hay que crearlo como cualquier otro objeto mediante new.

Ejemplo:
if(n==0) throw new ArithmeticException("Divisin por cero");

Si en un mtodo se usa la clusula throw para lanzar un tipo de excepcin marcada debe indicarse en su declaracin con la clusula
throws.

Relanzar Excepciones
Si se ha capturado una excepcin es posible desde el bloque catch relanzar la excepcin (el mismo objeto recibido en el bloque catch)
utilizando la instruccin throw objetoExcepcin.

Ejemplo. Relanzar una excepcin desde un mtodo al mtodo main:

Crear nuestras propias excepciones


Aunque Java proporciona una gran cantidad de excepciones, en algunas ocasiones necesitaremos crear excepciones propias.

Las excepciones propias deben ser subclases de la clase Exception.

Normalmente crearemos excepciones propias cuando queramos manejar excepciones no contempladas por la librera estndar de Java.
Por ejemplo, vamos a crear un tipo de excepcin llamado ValorNoValido que se lanzar cuando el valor utilizado en una determinada
operacin no sea correcto.
La clase podra ser la siguiente:

public class ValorNoValido extends Exception{


NOTAS DE CLASE PROGRAMACIN ORIENTADA A OBJETOS
USO DE EXCEPCIONES EN JAVA

public ValorNoValido(){ }
public ValorNoValido(String cadena){
super(cadena); //Llama al constructor de Exception y le pasa el contenido de cadena
}
}

Un programa para probar la excepcin creada podra ser este:

public static void main(String[] args) {


try {
double x = leerValor();
System.out.println("Raiz cuadrada de " + x + " = " + Math.sqrt(x));
}catch (ValorNoValido e) {
System.out.println(e.getMessage());
}
}

public static double leerValor() throws ValorNoValido {


Scanner sc = new Scanner(System.in);
System.out.print("Introduce nmero > 0 ");
double n = sc.nextDouble();
if (n <= 0) {
throw new ValorNoValido("El nmero debe ser positivo");
}
return n;
}

Fuentes de informacin
http://docs.oracle.com/javase/tutorial/essential/exceptions/
NOTAS DE CLASE PROGRAMACIN ORIENTADA A OBJETOS
USO DE EXCEPCIONES EN JAVA

Bradley Kjell, Curso Online


http://chortle.ccsu.edu/CS151/cs151java.html
http://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html

http://dis.um.es/~bmoros/Tutorial/parte9/cap9-1.html

You might also like