EXCEPCIONES
EXCEPCIONES
Programación I
Gestión de errores
Para poder entender mejor los errores que pueden
ocurrir en un programa, veamos un ejemplo: En el
estudio de la clase String, mencionamos una función,
que convierte un string en un número mediante la
función estática Integer.parseInt.
Manejo de Excepciones
import java.io.*;
class Leer
{ public static String dato()
{ String sdato = " ";
try
{
BufferedReader flujoE = new BufferedReader(new
InputStreamReader(System.in));
sdato = flujoE.readLine();
}
catch(IOException e)
{
System.out.println("Error: " + e.getMessage());
}
return sdato;
}
Manejo de Excepciones
Las palabras try y catch trabajan conjuntamente y pueden
traducirse así: “poner a prueba un fragmento de código por
si lanzara una excepción; si se ejecuta satisfactoriamente,
continuar con la ejecución del programa; si no, capturar la
excepción lanzada y manejarla”.
Manejo de Excepciones
Lanzar una excepción equivale a crear un objeto de la clase
de la excepción para manipularlo fuera del flujo normal de
ejecución del programa. Para lanzar una excepción se utiliza
la palabra reservada throw 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 éste ejecutara
una sentencia similar a la siguiente:
Lanzar Excepciones
Una vez lanzada la excepción, el sistema es responsable de
encontrar a alguien que la capture con el objetivo de manipularla.
El conjunto de esos “alguien” es el conjunto de métodos
especificados en la pila de llamadas hasta que ocurrió el error.
Lanzar Excepciones
Cuando se ejecute esta aplicación y se invoque al método
dato, la pila de llamadas crecerá como se observa en al
figura
BufferedReader.readLine
BufferedReader.readLine
Leer.dato
Leer.dato
Test.main
Test.main
try
{
//..
sdato = flujoEreadLine();
}
Lanzar Excepciones
2. Escribir un bloque catch capaz de capturar la
excepción lanzada. En la clase Leer presentada
anteriormente, el método dato tienen un bloque
match capaz de capturar excepciones de la clase
IOException y de sus subclases:
catch(IOException e)
{
System.out.println(“Error: ” + e.getMessage());
}
Lanzar Excepciones
En este manejador se
observa un parámetro e
que referencia al objeto
que se creo cuando se
lanzo la excepción
capturada. Para
manipularla, además de
escribir el código que
consideremos adecuado,
disponemos de la
funcionalidad
proporcionada por la
clase IOException, y la
que podremos acceder
mediante el objeto
Lanzar Excepciones
Del ejemplo presentado al principio de esta sesión, veamos como podemos solucionar
los errores:
Lanzar Excepciones
Cuando se trata de manejar excepciones, un bloque try puede
estar seguido de uno o mas bloques catch, tantos como
excepciones diferentes tengamos que manejar. Cada catch
tendrá un parámetro de la clase Throwable, de alguna clase
derivada de ésta, o bien de una clase de excepción definida por
el usuario. Cuando se lance una excepción, el bloque catch que
la capture será aquel cuyo parámetro sea de la clase de la
excepción o de una superclase directa o indirecta. Debido a esto,
el orden en el que se coloquen los bloques catch tiene que ser
tal, que cualquiera de ellos debe permitir alcanzar el siguiente,
de los contrario el compilador producirá un error.
Excepciones Derivadas
En cambio, en el ejemplo try
siguiente, una excepción de {
la clase EOFException será //...
capturada por el primer }
bloque catch; una excepción catch(EOFException e)
de la clase IOException será {
capturada por el bloque //Manejar esta clase de excepcion
segundo; una excepción de la }
clase catch(IOException e)
FileNotFoundException, {
subclase de IOException, //Manejar esta clase de excepcion o de
será capturada también por el alguna de sus subclases
bloque segundo; y una //excepto EOFException
excepción de la clase }
ClassNotFoundException, catch(Exception e)
subclase de la Exception, {
será capturada por el bloque //Manejar esta clase de excepcion o de
tercero. alguna de sus subclases
//excepto EOFException e IOException
}
Excepciones Derivadas
Excepciones Derivadas
El lenguaje Java proporciona las clases que manejan casi cualquier
tipo de excepción. Sin embargo, podemos imaginar situaciones en
la que producen excepciones que no están dentro del lenguaje Java.
Siguiendo el ejemplo anterior estudiaremos una situación en la que
el usuario introduce un valor fuera de un determinado intervalo, el
programa lanza un excepción, que vamos a llamar
ExcepcionIntervalo.
Excepciones Propias
La función miembro que lanza una excepción tiene la declaración
habitual que cualquier otro método pero se le añade a
continuación la palabra reservada throws seguido de la
excepción o excepciones que puede lanzar.
Excepciones Propias
Al programa
que divide
dos números,
le añadimos
la llamada a
la función
rango que
verifica si los
números
están dentro
del intervalo
dado, y el
bloque catch
que captura
la excepción
que puede
lanzar dicha
función si los
números no
están en el
intervalo
especificado.
Excepciones Propias
Hay otra alternativa para el
ejercicio anterior, que es la
de definir una función
denominada calcular, que
devuelva el cociente entre el
numerador y el
denominador, cuando se le
pasa los strings obtenidos de
los respectivos controles de
edición. La función calcular,
convierte los strings en
números enteros, verifica el
rango, calcula y devuelve el
cociente entre el numerador
y el denominador,
Excepciones Propias
Vemos que la función
calcular puede lanzar,
throws, tres tipos de
excepciones. En el cuerpo
de la función se crea, new,
y se lanza, throw,
explícitamente un objeto
de la clase
ExcepcionIntervalo,
definida por el usuario, e
implícitamente se crea y
se lanza objetos de las
clases
NumberFormatException
y ArithmeticException
definidas en el lenguaje
Java.
La sentencia que llama a
la función calcular dentro
del bloque try puede
producir alguna de las tres
excepciones que es
capturada por el
correspondiente bloque
catch.
Excepciones Propias
El bloque finally {...} debe ir detrás de todos los bloques catch
considerados. Si se incluye (ya que es opcional) sus sentencias se
ejecutan siempre, sea cual sea el tipo de excepción que se
produzca, o incluso si no se produce ninguna. El bloque finally
se ejecuta incluso si dentro de los bloques try/catch hay una
sentencia continue, break o return. La forma general de una
sección donde se controlan las excepciones es por lo tanto: