Bloque try {...} catch (...) finally {...}
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 en esta operación. El resto de problemas surgen durante la ejecución de los programas.
En el lenguaje Java, una Exceplion es un cierto tipo de error o una condición anormal que se
lia 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 lia producido. Otras excepciones, como por ejemplo 110
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 (definiendo por ejemplo un nuevo
path del fichero 110 encontrado).
Los errores se representan mediante clases derivadas de la clase Throwable, pero los que tiene que chequear un programador derivan de Exception (java.lang.Exception que a su vez deriva de Throwable). Existen algunos tipos de excepciones que Java obliga a tener en cuenta. Esto se hace mediante el uso de bloques try. catch y finally.
Los errores se representan mediante clases derivadas de la clase Throwable, pero los que tiene que chequear un programador derivan de Exception (java.lang.Exception que a su vez deriva de Throwable). Existen algunos tipos de excepciones que Java obliga a tener en cuenta. Esto se hace mediante el uso de bloques try. catch y finally.
El código dentro del bloque tiy está "vigilado". Si se produce una situación anormal y se lanza
como consecuencia una excepción, el control 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 se desee, cada uno de
los cuales tratará un tipo de excepción. Finalmente, si está presente, se ejecuta el bloque finally. que
es opcional, pero que en caso de existir se ejecuta siempre, sea cual sea el tipo de error.
En el caso en que el código de un método pueda generar una Exception y no se desee incluir
en dicho método la gestión del error (es decir los bucles try/catch correspondientes), es necesario
que el método pase la Exception al método desde el que ha sido llamado. Esto se consigue mediante
la adición de la palabra throws seguida del nombre de la Exception concreta, después de la lista de
argumentos del método. A su vez el método superior deberá incluir los bloques try/catch o volver a
pasar la Exception. De esta forma se puede ir pasando la Exception de un método a otro hasta llegar
al último método del programa, el método inainQ.
En el siguiente ejemplo se presentan dos métodos que deben "controlar" una IOException
relacionada con la lectura ficheros y una MyException propia. El primero de ellos (metodol) realiza
la gestión de las excepciones y el segundo (metodo2) las pasa al siguiente método.
void metodol() {
try {
try {
... // Código que puede lanzar las excepciones
IOException y MyException
} catch (IOException el) {// Se ocupa de IOException simplemente dando aviso
} catch (IOException el) {// Se ocupa de IOException simplemente dando aviso
System.out.println(el.getMessage());
} catch (MyException e2) {
} catch (MyException e2) {
// Se ocupa de MyException dando un aviso y
finalizando la función
System.out.println(e2.getMessage()); return;
System.out.println(e2.getMessage()); return;
} finally { // Sentencias que se ejecutarán en
cualquier caso
}]
}]
} // Fin del metodol
void metodo2() throws IOException, MyException
{
// Código que puede
lanzar las excepciones IOException y MyException
} // Fin del metodo2
} // Fin del metodo2
El tratamiento de excepciones se desarrollará con más profundidad en el Capítulo 8, a partir
de la página 145.