Manejo de Errores Usando Excepciones Java

El mensaje de error anterior es uno de los dos mensajes similares que ver�s si intentas compilar la clase InputFile, porque la clase InputFile contiene llamadas a m�todos que lanzan excepciones cuando se produce un error. El lenguaje Java requiere que los m�todos capturen o especifiquen todas las excepciones chequeadas que puedan ser lanzadas desde dentro del �mbito de ese m�todo. (Los detalles sobre lo que ocurre los puedes ver en la pr�xima p�gina Requerimientos de Java para Capturar o Especificar.)

Si el compilador detecta un m�todo, como los de InputFile, que no cumplen este requerimiento, muestra un error como el anterior y no compila el programa.

Echemos un vistazo a InputFile en m�s detalle y veamos que sucede.

La clase InputFile envuelve un canal FileInputStream y proporciona un m�todo, getLine(), para leer una l�nea en la posici�n actual del canal de entrada.

    // Nota: Esta clase no se compila por dise�o!
import java.io.*;

class InputFile {

    FileInputStream fis;

    InputFile(String filename) {
        fis = new FileInputStream(filename);
    }

    String getLine() {
        int c;
        StringBuffer buf = new StringBuffer();

        do {
            c = fis.read();
            if (c == '\n')             // nueva l�nea en UNIX
                return buf.toString();
            else if (c == '\r') {      // nueva l�nea en Windows 95/NT 
                c = fis.read();
                if (c == '\n')
                    return buf.toString();
                else {
                    buf.append((char)'\r');
                    buf.append((char)c);
                }
            } else
                buf.append((char)c);
        } while (c != -1);

        return null;
    }
}

El compilador dar� el primer error en la primera l�nea que est� en negrita. Esta l�nea crea un objeto FileInputStream y lo utiliza para abrir un fichero (cuyo nombre se pasa dentro del constructor del FileInputStream).

Entonces, �Qu� debe hacer el FileInputStream si el fichero no existe? Bien, eso depende de lo que quiera hacer el programa que utiliza el FileInputStream. Los implementadores de FileInputStream no tenian ni idea de lo que quiere hacer la clase InputFile si no existe el fichero. �Debe FileInputStream terminar el programa? �Debe intentar un nombre alternativo? o �deber�a crear un fichero con el nombre indicado? No existe un forma posible de que los implemetadores de FileInputStream pudieran elegir una soluci�n que sirviera para todos los usuarios de FileInputStream. Por eso ellos lanzaron una excepci�n. Esto es, si el fichero nombrado en el argumento del constructor de FileInputStream no existe, el constructor lanza una excepci�n java.io.FileNotFoundException. Mediante el lanzamiento de esta excepci�n, FileInputStream permite que el m�todo llamador maneje ese error de la forma que considere m�s apropiada.

Como puedes ver en el listado, la clase InputFile ignora completamente el hecho de que el constructor de FileInputStream puede lanzar un excepci�n. Sin embargo, El lenguaje Java requiere que un m�todo o bien lance o especifique todas las excepciones chequeadas que pueden ser lanzadas desde dentro de su �mbito. Como la Clase InputFile no hace ninguna de las dos cosas, el compilador rehusa su compilaci�n e imprime el mensaje de error.

Adem�s del primer error mostrado arriba, se podr� ver el siguiente mensaje de error cuando se compile la clase InputFile.

InputFile.java:15: Warning: Exception java.io.IOException must be caught, 
or it must be declared in throws clause of this method.
        while ((c = fis.read()) != -1) {
                            ^

El m�todo getLine() de la clase InputFile lee una l�nea desde el FileInputStream que fue abierto por el constructor de InputFile. El m�todo read() de FileInputStream lanza la excepci�n java.io.IOException si por alguna raz�n no pudiera leer el fichero. De nuevo, la clase InputFile no hace ning�n intento por capturar o especificar esta excepci�n lo que se convierte en el segundo mensaje de error.

En este punto, tenemos dos opciones. Se puede capturar las excepciones con los m�todos apropiados en la clase InputFile, o se puede esquivarlas y permitir que otros m�todos anteriores en la pila de llamadas las capturen. De cualquier forma, los m�todos de InputFile deben hacer algo, o capturar o especificar las excepciones, antes de poder compilar la clase InputFile. Aqu� tiene la clase InputFileDeclared, que corriege los errores de InputFile mediante la especificaci�n de las excepciones.

La siguiente p�gina le describe con m�s detalles los Requerimientos de Java para Capturar o Especificar. Las p�ginas siguientes le ense�ar�n c�mo cumplir estos requerimientos.

COMPARTE ESTE ARTÍCULO

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

SIGUIENTE ARTÍCULO