Page 1

EJEMPLO CON UNA SOLA EXCEPCIÓN En este ejemplo capturaremos la excepción ArithmeticException, que es una subclase de RuntimeException; aunque no es obligatorio tratar las excepciones que derivan de RuntimeException, en ciertos casos resulta conveniente. La clase Excepcion1 implementa un bucle sin fin (líneas 3 y 18) que recoge un valor entero suministrado por el usuario (línea 7) y lo utiliza como denominador en una división (línea 8). Todo ello dentro de un bloque try (líneas 5 y 10). El bloque catch atiende únicamente a excepciones de tipo ArithmeticException (línea 12), imprimiendo el mensaje “Divi sion por cero” en la consola (línea 13). La instrucción situada en la línea 16 nos muestra como se ejecuta el programa tras los bloques ligados try-catch.

1 public class Excepcion1 { 2 public static void main(String[] args) { 3 do { 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:


Si introducimos un valor distinto de cero se ejecutan todas las instrucciones del bloque try, ninguna del catch (no se produce la excepción) y la instrucción siguiente al catch. Si introducimos el valor cero se ejecutan las instrucciones del try hasta que se produce la excepción (línea 8), por lo que la línea 9 no se ejecuta; posteriormente se ejecutan las instrucciones del catch y finalmente las posteriores al bloque catch.


SINTAXIS Y FUNCIONAMIENTO CON MÁS DE UNA EXCEPCIÓN Una porción de código contenida en un bloque try, potencialmente puede provocar más de una excepción, por lo que Java permite asociar varios bloques catch a un mismo bloque try. La sintaxis es la siguiente:

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 } No se pueden poner instrucciones entre los bloques catch. Cuando “se levanta” (ocurre) una excepción en las instrucciones del bloque try, se recorren en orden los bloques catch hasta que se encuentra uno con el mismo tipo o un tipo que es superclase de la excepción que ha llegado. Se ejecutan únicamente las instrucciones del bloque catch que cumple los requisitos (si es que alguno los cumple). De esta manera sería 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 } Si ocurre una excepción del tipo NullPointerException se ejecutan las instrucciones asociadas al primer bloque catch. Si ocurre una excepción del tipo RunTimeException o de una clase derivada del mismo (distinta a NullPointerException) se ejecutan las instrucciones asociadas al segundo bloque catch. Si ocurre una excepción del tipo Exception o de una clase derivada del mismo (distinta a RuntimeException) se ejecutan las instrucciones asociadas al tercer bloque catch Si cambiásemos el orden (en cualquiera de sus posibles combinaciones) de los bloques catch del ejemplo nos encontraríamos con un error de compilación, puesto que al menos un bloque catch no podría ejecutarse nunca. Resulta habitual utilizar varios bloques catch correspondientes a excepciones con un mismo nivel de herencia, por ejemplo con subclases de RuntimeException:

1 public class Excepcion2 { 2 public static void main(String[] args) { 3 int Posicion=0; 4 do{ 5 try { 6 float[] Valores = new float[5]; 7 System.out.print("Posicion: "); 8 Posicion = Teclado.Lee_int(); 9 System.out.print("Valor: "); 10 int Valor = Teclado.Lee_int(); 11 12 float Auxiliar = 8/Valor; 13 Valores[Posicion] = Auxiliar; 14 } 15 16 catch (ArithmeticException e) { 17 System.out.println("Division por cero"); 18 } 19 20 catch(IndexOutOfBoundsException e) { 21 System.out.println("Indice fuera del array"); 22 } 23 24 System.out.println("Hola"); 25 26 } while (Posicion!=10); 27 } 28 }

El código de la clase Excepcion2 contiene un bloque try (líneas 5 a 14) y dos bloques catch (líneas 16 a 18 y 20 a 22). En el bloque try se define un vector de 5 posiciones float (línea 6) y se piden dos


valores enteros; el primero (línea 8) servirá de índice para almacenar un dato en la posición indicada del vector Valores (línea 13), el segundo valor (obtenido en la línea 10) actuará de denominador en una división (línea 12). Como se puede comprobar, las instrucciones del bloque try pueden generar, al menos, dos excepciones: ArithmeticException e IndexOutOfBoundsException. Si introducimos un índice ( Posición) mayor que 4 (el vector abarca de 0 a 4) nos encontramos con una excepción del segundo tipo, mientras que si introducimos como denominador (valor) un cero, nos encontramos con una excepción aritmética.

Como se puede observar analizando la ejecución mostrada, una vez que se produce una excepción se termina la ejecución en el bloque try y se pasa al bloque catch correspondiente (en caso de que exista).

EL BLOQUE FINALLY Como hemos visto, una vez que llega una excepci ón dentro de un bloque try, las instrucciones siguientes (en el bloque) a la que causa la excepción no se ejecutan. Esto puede dar lugar a que dejemos el sistema en un estado no deseado (ficheros abiertos, comunicaciones sin terminar, recursos bloqueados, etc.). Para evitar este tipo de situaciones, Java proporciona la posibilidad de incluir un bloque ( finally ) cuyas instrucciones siempre se ejecutan después de las del catch seleccionado. La sintaxis es:

try {


............. } catch (TipoExcepcion1 Identificador) { ............. } ............. catch (TipoExcepcionN Identificador) { .............. } finally { // instrucciones que siempre se ejecutan }

Las instrucciones del bloque finally siempre se ejecutan, independientemente de que se trate o no una excepci贸n. Si en el bloque try existe una sentencia return, las instrucciones del bloque finally tambi茅n se ejecutan antes que el return.

Ejemplo con una sola excepción  
Read more
Read more
Similar to
Popular now
Just for you