Вы находитесь на странице: 1из 5

4.

6 Excepciones

Excepciones, o sencillamente problemas. En la programacin siempre se producen errores, ms o menos graves, pero que hay que gestionar y tratar correctamente. Por ello en java disponemos de un mecanismo
consistente en el uso de bloques try/catch/finally. La tcnica bsica consiste en colocar las instrucciones que podran provocar problemas dentro de un bloque try, y colocar a continuacin uno o ms bloques catch,
de tal forma que si se provoca un error de un determinado tipo, lo que haremos ser saltar al bloque catch capaz de gestionar ese tipo de error especfico. El bloque catch contendr el codigo necesario para
gestionar ese tipo especfico de error. Suponiendo que no se hubiesen provocado errores en el bloque try, nunca se ejecutaran los bloques catch.

Veamos ahora la estructura del bloque try/catch/finally:

try

//Cdigo que puede provocar errores

catch(Tipo1 var1)

//Gestin del error var1, de tipo Tipo1

catch(TipoN varN)

//Gestin del error varN, de tipo TipoN

}]

finally

//Cdigo de finally

Como podemos ver es obligatorio que exista la zona try, o zona de pruebas, donde pondremos las instrucciones problemticas. Despus vienen una o ms zonas catch, cada una especializada en un tipo de
error o excepcin. Por ltimo est la zona finally, encargada de tener un cdigo que se ejecutar siempre, independientemente de si se produjeron o no errores.

Se puede apreciar que cada catch se parece a una funcin en la cul slo recibimos un objeto de un determinado tipo, precisamente el tipo del error. Es decir slo se llamar al catch cuyo argumento sea
coincidente en tipo con el tipo del error generado.

Prcticas:

Crear el fichero Try1.java

Agregar el siguiente cdigo:

public class Try1

public static void main(String arg[])

int [] array = new int[20];

array[-3] = 24;

Como podremos comprobar al ejecutar se generar el siguiente error:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException

at Try1.main(Try1.java:6)

El cul indica que se ha generado una excepcin del tipo java.lang.ArrayIndexOutOfBoundsException en la funcin Try1.main, dentro del fichero Try1.java y en la lnea 6 del
cdigo. Esta excepcin en particular se lanza cuando intentamos acceder a una posicin de un array y no existe dicha posicin.

Vamos a gestionar esta interrupcin mediante un bloque try/catch, el fichero crear es Try2.java, con el siguiente cdigo:
public class Try2

public static void main(String arg[])

int [] array = new int[20];

try

array[-3] = 24;

catch(ArrayIndexOutOfBoundsException excepcion)

System.out.println(" Error de ndice en un array");

Intentemos provocar tambien un error de tipo divisin por cero y pongamos un catch especfico para dicho error (fichero Try3.java):

public class Try3

public static void main(String arg[])

int [] array = new int[20];

try

// array[-3] = 24;

int b = 0;

int a = 23/b;

catch(ArrayIndexOutOfBoundsException excepcion)

System.out.println(" Error de ndice en un array");

catch(ArithmeticException excepcion)

System.out.println(" Error de ndice en un array");

Podemos comprobar que se ejecuta el catch correspondiente al tipo de error generado. La lnea que lanza el error de ndice la hemos comentado para que no lo genere y
podamos generar el error de divisin por cero.

Los tipos de error que se generan son todos ellos clases, que heredan de la clase java.lang.Exception, por lo tanto podramos crear nuestro propios errores personalizados. Al igual que podramos tener un solo
catch que capture todos los errores, independientemente del tipo del error.

Prcticas:

Construyamos la clase Try4 y agreguemos el siguiente cdigo:

public class Try4

public static void main(String arg[])

int [] array = new int[20];

try
{

// array[-3] = 24;

/* int b = 0;

int a = 23/b;

*/

String s = null;

s.equals("QQQQ");

catch(ArrayIndexOutOfBoundsException excepcion)

System.out.println(" Error de ndice en un array");

catch(ArithmeticException excepcion)

System.out.println(" Error de ndice en un array");

catch(Exception excepcion)

System.out.println("Se ha generado un error que no es de ndices, ni Aritmtico");

System.out.println("El objeto error es de tipo " + excepcion);

Podemos comprobar que el catch que captura el error es el correspondiente a la clase base Exception, el orden de seleccin del catch es desde arriba a abajo, se comprueba el
tipo del error con el del argumento del primer catch, luego con el del segundo, Hasta que uno de los catch tenga el mismo tipo y pueda gestionarlo. Por ello el catch de la clase
base debe de ser el ltimo, y los de las clases derivadas deben de estar antes.

Al transformar un objeto que herede de Exception a un String el resultado es el nombre de la excepcin.

La clase Exception proporciona algunos mtodos de utilidad, por ejemplo printStackException que muestra el volcado de pila con todas las funciones que estan siendo llamadas en el momento en el que se lanz el
error:

try

array[-3] = 24;

catch(Exception excepcion)

excepcion.printStackTrace();

Si es necesario podemos lanzar un error siempre que lo consideremos oportuno, para ello tenemos que usar la palabra clave throw y especificar un objeto que sea un objeto de la clase Exception, o de una clase
derivada.

Prcticas:

Creemos Try5.java con el siguiente cdigo:

public class Try5

public static void main(String arg[])

try

{
Exception e = new Exception("Este es mi propio error.");

throw e;

catch(Exception excepcion)

excepcion.printStackTrace();

Ahora construyamos nuestra propia clase personalizada de error y lancemos un error, como en el cdigo del fichero Try6.java:

public class Try6

public static void main(String arg[])

try

MiPropioError e = new MiPropioError("Este es mi propio error.");

throw e;

catch(Exception excepcion)

excepcion.printStackTrace();

class MiPropioError extends Exception{

public MiPropioError(String mensaje){

super(mensaje);

Habitualmente dentro de try solicitamos recursos y trabajamos con ellos, en esos casos se pueden lanzar excepciones, pero la nica manera de liberar recursos independientemente de si se lanza una excepcin o
no consiste en emplear una clasula finally, que ser ejecutada siempre, haya o no haya lanzamiento de excepciones.

Prcticas:
Construyamos el fichero Tray7.java:

public class Try7

public static void main(String arg[])

try

Exception e = new Exception("Este es mi propio error.");

throw e;

catch(Exception excepcion)

excepcion.printStackTrace();

finally

System.out.println("Se ejecuta finally");

Вам также может понравиться