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.
- La sentencia new FileOutputStream falla y lanza una IOException.
- La sentencia victor.elementAt(i) falla y lanza una ArrayIndexOutOfBoundsException.
- 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