Manejo de Excepciones

Excepciones

El lenguaje JAVA incorpora soporte para manejar situaciones anómalas, conocidas como “excepciones”, que pueden ocurrir durante la ejecución de un programa. Con el sistema de manipulación de excepciones Java, un programa puede comunicar eventos inesperados a un contexto de ejecución más capacitado para responder a tales eventos anormales. Estas excepciones son manejadas por código fuera del flujo normal de control del programa.

Algunos casos de situaciones anómalas pueden ser: invocar un método sobre un objeto "null", intentar dividir un número entre 0, intentar abrir un archivo o formulario que no existe, agotar la memoria de la JVM al ejecutar (ciclo infinito), tratar de recuperar información de Internet y no contamos en ese momento de conexión, etc.

Manejo de excepciones:

Cuando un método se encuentra con una anomalía que no puede resolver, la lógica es que lance (throw) una excepción, esperando que quien lo llamo directamente o indirectamente la capture (catch) y maneje la anomalía. Incluso el mismo podría capturar y manipular dicha excepción. Si la excepción no se captura, el programa finalizara automáticamente.

La forma en que el programador trate a la excepción es lo que se conoce como manejo o gestión de la excepción.

Las excepciones NO sirven para "corregir" errores de programación por ejemplo, si un programa, durante su ejecución, no encuentra un determinado archivo, por medio de las excepciones no vamos a conseguir que el archivo "aparezca". O si en un determinado programa intentamos acceder a una posición de un "array" mayor que la longitud del mismo (o a una posición negativa), las excepciones no van a conseguir que dicha posición en el "array" exista.

Las excepciones sirven primero para alertarnos de la situación, segundo para dejarnos decidir el comportamiento del programa.

Revisando un ejemplo sencillo:

Su resultado es:

Ahora realizamos una división entre 0:

Resultado:

Como podemos ver aparece la palabra "Infinity" que asigna Java a las divisiones por cero.

En programas más robustos un valor de "Infinity" puede provocar respuestas inesperadas, en este caso el usuario puede tratar el caso "excepcional" de manera diferente. La forma natural de manejar a esta instrucción es mediante una estructura condicional (if... else...) que nos permita separar dicho caso, de los casos que el programa puede tratar de forma convencional.

Por ejemplo, ¿recuerda la clase leer? Según puede observar a continuación, el método dato de esta clase invoca a readline con el propósito de devolver un objeto String correspondiente a la cadena leída. Según se ha explicado anterior mente, readLine puede lanzar una excepción de la clase Ioexception. Para manejarla hay que capturarla, para lo cual se utiliza un bloque catch, y para poder capturarla hay que encerrar el código que puede lanzarla en un bloque try.

Import java.io.*;

Public class Leer

{

public static String dato()

{

String sdato=””;

Try

{// Definir un flujo de carácter de entrada: flujo E

Input StreamReader isr= new InputStreamReader(System.in);

BufferedReader flujoE= new BuferedReader(isr);

//Leer. La entrada finaliza al pulasr la tecla Entrar sdato= flujoE. readLine();

}

Catch(IOException e)

{

System.err.println(“Error: “ + e.getMessage());

}

Return sdato; //devolver el dato teclado

}

//…

}

Las palabras try y catch trabajan conjuntamente y pueden traducirse así: “poner a prueba un fragmento de código por si lanzar una excepcion; si se ejecuta satisfactoriamente, continuar con la ejecucion del programa; si, no capturar la excepcion lanzada y manejada”

Lanzar una excepcion

Equivale a crear un objeto de la clase de la excepción par manipularlo fuera del flujo normal de ejecución del programa. Para lanzar una excepcion se utiliza la palabra reservada trow y para crear un objeto, new. Por ejemplo volviendo al método datos de la clase Leer expuesta anteriormente, si ocurre un error cuando se ejecute el método readLine se supone que este ejecutara una sentencia similar a la siguiente:

If( error) throw new IOException ();

Esta sentencia lanza una excepcion de la clase IOException lo que implica crear un objeto de esta clase. Un objeto de estos contiene información acerca de la excepcion, incluyendo su tipo y el estado del sistema cuando el error ocurrió.

Ejercicio:

Modificar la aplicación realizada en el capit. 10 sobre el mantenimiento de una lista de teléfonos, para que el método registro lance la excpecion “índice fuera de limite” cuando será preciso . Recuerde que el método registro devolvería el objeto Cpersona que estaba en la posición i de la matriz listaTelefonos, o un valor null si la posición especificada estaba fuera de limite.

Entre las clases de excepcion que proporcion a Java esta IndexOutOfBoundsExpception: excepcion lanzada cuando al acceder a un elemento de una matriz o de una colección el índice esta fuera de limite; esta es la excepcion que lanzara el metodo get invocado por registro cuando al acceder un elemento de la colección i<0Iii>=size() . Public CPersonas registro(int i)

{

Return lista Teléfonos.get(i);

}

Ahora habra que capturar la excepcion de tipo IndexOutOfBoundsExpception que puede lanzar get cuando invoquemos a registr. Esto se puede hacer en diferentes puntos. Puesto que registro es invocado desde el metodo buscar de test y este es invocado desde main, podemos capturar la excepcion en cualquiera de esos metodos. No lo haremos en reguistro porque en el tratamiento de la excepcion tendria que devolver null y esto es solucion. Lo haremos en busca o en main como se indica.