PDF de programación - Capítulo 8: Excepciones - Curso Completo de Java

Imágen de pdf Capítulo 8: Excepciones - Curso Completo de Java

Capítulo 8: Excepciones - Curso Completo de Javagráfica de visualizaciones

Actualizado el 21 de Marzo del 2018 (Publicado el 4 de Enero del 2018)
547 visualizaciones desde el 4 de Enero del 2018
96,5 KB
21 paginas
Creado hace 20a (02/03/2000)
Capítulo 8: Excepciones

8. EXCEPCIONES

página 135

A diferencia de otros lenguajes de programación orientados a objetos como C/C++, Java incorpora
en el propio lenguaje la gestión de errores. El mejor momento para detectar los errores es durante la
compilación. Sin embargo prácticamente sólo los errores de sintaxis son detectados durante este
periodo. El resto de problemas surgen durante la ejecución de los programas.

En el lenguaje Java, una Exception es un cierto tipo de error o una condición anormal que se
ha producido durante la ejecución de un programa. Algunas excepciones son fatales y provocan que
se deba finalizar la ejecución del programa. En este caso conviene terminar ordenadamente y dar un
mensaje explicando el tipo de error que se ha producido. Otras, como por ejemplo no encontrar un
fichero en el que hay que leer o escribir algo, pueden ser recuperables. En este caso el programa
debe dar al usuario la oportunidad de corregir el error (indicando una nueva localización del fichero
no encontrado).
Un buen programa debe gestionar correctamente todas o la mayor parte de los errores que se pueden
producir. Hay dos “estilos” de hacer esto:

1. A la “antigua usanza”: los métodos devuelven un código de error. Este código se
chequea en el entorno que ha llamado al método con una serie de if elseif …, gestionando
de forma diferente el resultado correcto o cada uno de los posibles errores. Este sistema
resulta muy complicado cuando hay varios niveles de llamadas a los métodos.

2. Con soporte en el propio lenguaje: En este caso el propio lenguaje proporciona
construcciones especiales para gestionar los errores o Exceptions. Suele ser lo habitual en
lenguajes modernos, como C++, Visual Basic y Java.

En los siguientes apartados se examina cómo se trabaja con los bloques y expresiones try,
catch, throw, throws y finally, cuándo se deben lanzar excepciones, cuándo se deben capturar y
cómo se crean las clases propias de tipo Exception.

8.1 EXCEPCIONES ESTÁNDAR DE JAVA

Los errores se representan mediante dos tipos de clases derivadas de la clase Throwable: Error y
Exception. La siguiente figura muestra parcialmente la jerarquía de clases relacionada con
Throwable:

Error

Throwable

Exception

RuntimeException

IOException

AWTException

...

NullPointerException

EOFException

IndexOutOfBoundsException

FileNotFoundException

NegativeArraySizeException

MalformedURLException

...

...

Figura 8.1: Jerarquía de clases derivadas de Throwable.



marianistas.org Aprenda Java como si estuviera en Primero

página 136

La clase Error está relacionada con errores de compilación, del sistema o de la JVM. De
ordinario estos errores son irrecuperables y no dependen del programador ni debe preocuparse de
capturarlos y tratarlos.

La clase Exception tiene más interés. Dentro de ella se puede distinguir:
1. RuntimeException: Son excepciones muy frecuentes, de ordinario relacionadas con

errores de programación. Se pueden llamar excepciones implícitas.

2. Las demás clases derivadas de Exception son excepciones explícitas. Java obliga a

tenerlas en cuenta y chequear si se producen.

El caso de RuntimeException es un poco especial. El propio Java durante la ejecución de un
programa chequea y lanza automáticamente las excepciones que derivan de RuntimeException. El
programador no necesita establecer los bloques try/catch para controlar este tipo de excepciones.
Representan dos casos de errores de programación:

1. Un error que normalmente no suele ser chequeado por el programador, como por ejemplo

recibir una referencia null en un método.

2. Un error que el programador debería haber chequeado al escribir el código, como
sobrepasar el tamaño asignado de un array (genera un ArrayIndexOutOfBoundsException
automáticamente).

En realidad sería posible comprobar estos tipos de errores, pero el código se complicaría
excesivamente si se necesitara chequear continuamente todo tipo de errores (que las referencias son
distintas de null, que todos los argumentos de los métodos son correctos, y un largo etcétera).

Las clases derivadas de Exception pueden pertenecer a distintos packages de Java. Algunas
java.io
perenecen a
(EOFException, FileNotFoundException, ...) o a otros packages. Por heredar de Throwable todos
los tipos de excepciones pueden usar los métodos siguientes:

(Throwable, Exception, RuntimeException, …); otras a

java.lang

1. String getMessage()
2. String toString()
3. void printStackTrace()

Extrae el mensaje asociado con la excepción.
Devuelve un String que describe la excepción.
Indica el método donde se lanzó la excepción.

8.2 LANZAR UNA EXCEPTION

Cuando en un método se produce una situación anómala es necesario lanzar una excepción. El
proceso de lanzamiento de una excepción es el siguiente:
1. Se crea un objeto Exception de la clase adecuada.
2. Se lanza la excepción con la sentencia throw seguida del objeto Exception creado.

// Código que lanza la excepción MyException una vez detectado el error
MyException me = new MyException("MyException message");
throw me;
Esta excepción deberá ser capturada (catch) y gestionada en el propio método o en algún otro
lugar del programa (en otro método anterior en la pila o stack de llamadas), según se explica en el
Apartado 8.3.

Capítulo 8: Excepciones

página 137

Al lanzar una excepción el método termina de inmediato, sin devolver ningún valor.
Solamente en el caso de que el método incluya los bloques try/catch/finally se ejecutará el bloque
catch que la captura o el bloque finally (si existe).

Todo método en el que se puede producir uno o más tipos de excepciones (y que no utiliza
directamente los bloques try/catch/finally para tratarlos) debe declararlas en el encabezamiento de
la función por medio de la palabra throws. Si un método puede lanzar varias excepciones, se ponen
detrás de throws separadas por comas, como por ejemplo:

public void leerFichero(String fich) throws EOFException, FileNotFoundException {…}
Se puede poner únicamente una superclase de excepciones para indicar que se pueden lanzar

excepciones de cualquiera de sus clases derivadas. El caso anterior sería equivalente a:

public void leerFichero(String fich) throws IOException {…}
Las excepciones pueden ser lanzadas directamente por leerFichero() o por alguno de los
métodos llamados por leerFichero(), ya que las clases EOFException y FileNotFoundException
derivan de IOException.

Se recuerda que no hace falta avisar de que se pueden lanzar objetos de la clases Error o

RuntimeException (excepciones implícitas).

8.3 CAPTURAR UNA EXCEPTION

Como ya se ha visto, ciertos métodos de los packages de Java y algunos métodos creados por
cualquier programador producen (“lanzan”) excepciones. Si el usuario llama a estos métodos sin
tenerlo en cuenta se produce un error de compilación con un mensaje del tipo: “… Exception
java.io.IOException must be caugth or it must be declared in the throws clause of this method”. El
programa no compilará mientras el usuario no haga una de estas dos cosas:

1. Gestionar la excepción con una construcción del tipo try {…} catch {…}.
2. Re-lanzar la excepción hacia un método anterior en el stack, declarando que su método
también lanza dicha excepción, utilizando para ello la construcción throws en el header
del método.

El compilador obliga a capturar las llamadas excepciones explícitas, pero no protesta si se
captura y luego no se hace nada con ella. En general, es conveniente por lo menos imprimir un
mensaje indicando qué tipo de excepción se ha producido.

8.3.1 Bloques try y catch
En el caso de las excepciones que no pertenecen a las RuntimeException y que por lo tanto Java
obliga a tenerlas en cuenta habrá que utilizar los bloques try, catch y finally. El código dentro del
bloque try está “vigilado”: Si se produce una situación anormal y se lanza por lo tanto una
excepción el control salta o sale del bloque try y pasa al bloque catch, que se hace cargo de la
situación y decide lo que hay que hacer. Se pueden incluir tantos bloques catch como sean
necesarios, cada uno de los cuales tratará un tipo de excepción.

Las excepciones se pueden capturar individualmente o en grupo, por medio de una superclase

de la que deriven todas ellas.

El bloque finally es opcional. Si se incluye sus sentencias se ejecutan siempre, sea cual sea la
excepción que se produzca o si no se produce ninguna. El bloque finally se ejecuta aunque en el
bloque try haya un return.

marianistas.org Aprenda Java como si estuviera en Primero

página 138

En el siguiente ejemplo se presenta un método que debe "controlar" una IOException

relacionada con la lectura ficheros y una MyException propia:

void metodo1(){

...
try {

// Código que puede lanzar las excepciones IOException y MyException

} catch (IOException e1) {// Se ocupa de IOException simplemente dando aviso

System.out.println(e1.getMessage());

} catch (MyException e2) {

// Se ocupa de MyException dando un aviso y finalizando la función
System.out.println(e2.getMessage()); return;

} finally { // Sentencias que se ejecutarán en cualquier caso

...

}
...

} // Fin del metodo1

8.3.2 Relanzar una Exception
Existen algunos casos en los cuales el código de un método puede generar una Exception y no se
desea incluir en dicho método la gestión del error. Java permite que este método pase o relance
(throws) la Exception al método desde el que ha sido llamado, sin incluir en el método los bucles
try/catch correspondientes. Esto se consigue mediante la adición de throws más el nombre de la
Exceptio
  • Links de descarga
http://lwp-l.com/pdf8184

Comentarios de: Capítulo 8: Excepciones - Curso Completo de Java (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios
Es necesario revisar y aceptar las políticas de privacidad