Manejo de Errores Usando Excepciones Java

Cuando se juntan todos los componentes, el m�todo writeList() se parece a esto.

public void writeList() {
    PrintStream pStr = null;

    try {
        int i;

        System.out.println("Entrando en la Sentencia try");
        pStr = new PrintStream(
                new BufferedOutputStream(
                 new FileOutputStream("OutFile.txt")));

        for (i = 0; i < size; i++)
            pStr.println("Value at: " + i + " = " + victor.elementAt(i));
    } catch (ArrayIndexOutOfBoundsException e) {
        System.err.println("Caught ArrayIndexOutOfBoundsException: " + e.getMessage());
    } catch (IOException e) {
        System.err.println("Caught IOException: " + e.getMessage());
    } finally {
        if (pStr != null) {
            System.out.println("Cerrando PrintStream");
            pStr.close();
        } else {
            System.out.println("PrintStream no est� abierto");
        }
    }
}

El bloque try de este m�todo tiene tres posibilidades de salida direrentes.

  1. La sentencia new FileOutputStream falla y lanza una IOException.
  2. La sentencia victor.elementAt(i) falla y lanza una ArrayIndexOutOfBoundsException.
  3. Todo tiene �xito y la sentencia try sale normalmente.

Est� p�gina investiga en detalle lo que sucede en el m�todo writeList durante cada una de esas posibilidades de salida.

.�Escenario 1:Ocurre una excepci�n IOException

La sentencia new FileOutputStream("OutFile.txt") puede fallar por varias razones: el usuario no tiene permiso de escritura sobre el fichero o el directorio, el sistema de ficheros est� lleno, o no existe el directorio. Si cualquiera de estas situaciones es verdadera el constructor de FileOutputStream lanza una excepci�n IOException.

Cuando se lanza una excepci�n IOException, el sistema de ejecuci�n para inmediatamente la ejecuci�n del bloque try. Y luego intenta localizar un manejador de excepci�n apropiado para manejar una IOException.

El sistema de ejecuci�n comienza su b�squeda al principio de la pila de llamadas. Cuando ocurri� la excepci�n, el constructor de FileOutputStream estaba al principio de la pila de llamadas. Sin embargo, este constructor no tiene un manejador de excepci�n apropiado por lo que el sistema comprueba el siguiente m�todo que hay en la pila de llamadas -- el m�todo writeList(). Este m�todo tiene dos manejadores de excepciones: uno para ArrayIndexOutOfBoundsException y otro para IOException.

El sistema de ejecuci�n comprueba los manejadores de writeList() por el orden en el que aparecen despu�s del bloque try. El primer manejador de excepci�n cuyo argumento corresponda con el de la excepci�n lanzada es el elegido por el sistema de ejecuci�n. (El orden de los manejadores de excepci�n es importante!) El argumento del primer manejador es una ArrayIndexOutOfBoundsException, pero la excepci�n que se ha lanzado era una IOException. Una excepci�n IOException no puede asignarse legalmente a una ArrayIndexOutOfBoundsException, por eso el sistema de ejecuci�n contin�a la b�squeda de un manejador de excepci�n apropiado.

El argumento del segundo manejador de excepci�n de writeList() es una IOException. La excepci�n lanzada por el constructor de FileOutputStream tambi�n es una una IOException y por eso puede ser asignada al argumento del manejador de excepciones de IOException. As�, este manejador parece el apropiado y el sistema de ejecuci�n ejecuta el manejador, el cual imprime esta sentencia.

Caught IOException: OutFile.txt

Despu�s de que se haya ejecutado el manejador de excepci�n, el sistema pasa el control al bloque finally. En este escenario particular, el canal PrintStream nunca se ha abierto, as� el pStr es null y no se cierra. Despu�s de que se haya completado la ejecuci�n del bloque finally, el programa continua con la primera sentencia despu�s de este bloque.

La salida completa que se podr� ver desde el programa ListOfNumbers cuando se lanza un excepci�n IOException es esta.

Entrando en la sentecia try
Caught IOException: OutFile.txt
PrintStream no est� abierto

.�Escenario 2: Ocurre una excepci�n ArrayIndexOutOfBoundsException

Este escenario es el mismo que el primero excepto que ocurre un error diferente dentro del bloque try. En este escenario, el argumento pasado al m�todo elementAt() de Vector est� fuera de l�mites. Esto es, el argumento es menor que cero o mayor que el tama�o del array. (De la forma en que est� escrito el c�digo, esto es realmente imposible, pero supongamos que se ha introducido un error cuando alguien lo ha modificado).

Como en el escenario 1, cuando ocure una excepci�n el sistema de ejecuci�n para la ejecuci�n del bloque try e intenta localizar un manejador de excepci�n apropiado para ArrayIndexOutOfBoundsException. El sistema busca como lo hizo anteriormente. Llega a la sentencia catch en el m�todo writeList() que maneja excepciones del tipo ArrayIndexOutOfBoundsException. Como el tipo de la excepci�n corresponde con el de el manejador, el sistema ejecuta el manejador de excepci�n.

Despu�s de haber ejecutado el manejador de excepci�n, el sistema pasa el control al bloque finally. En este escenario particular, el canal PrintStream si que se ha abierto, as� que el bloque finally lo cerrar�. Despu�s de que el bloque finally haya completado su ejecuci�n, el programa contin�a con la primera sentencia despu�s de este bloque.

Aqu� tienes la salida completa que dar� el programa ListOfNumbers si ocurre una excepci�n ArrayIndexOutOfBoundsException.

Entrando en la sentencia try
Caught ArrayIndexOutOfBoundsException: 10 >= 10
Cerrando PrintStream

.�Escenario 3: El bloque try sale normalmente

En este escenario, todas las sentencias dentro del �mbito del bloque try se ejecutan de forma satisfactoria y no lanzan excepciones. La ejecuci�n cae al final del bloque try y el sistema pasa el control al bloque finally. Como todo ha salido satisfactorio, el PrintStream abierto se cierra cuando el bloque finally consigue el control. De nuevo, Despu�s de que el bloque finally haya completado su ejecuci�n, el programa contin�a con la primera sentencia despu�s de este bloque.

Aqu� tienes la salida cuando el programa ListOfNumbers cuando no se lanzan excepciones.

Entrando en la sentencia try
Cerrando PrintStream

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO