New 2 Java: Construir una Aplicación: 4.- Leer y Escribir Ficheros y Manejar Excepciones

La mejor forma de manejar esta condici�n particular es:

Imprimir un mensaje de error en la consola y proporcionar un mensaje desplegable para el usuario. Los mensajes de error que van a la consola son �tiles para los desarrolladores, y un mensaje GUI, como una ventana desplegable, es �til para el usuario final. Sin embargo, hay muchas t�cnicas que manejan lo que hace el programa cuando no se puede encontrar un fichero especificado.

.�Manejar las Condiciones Lanzadas

Hay muchas formas para manejar problemas. Algunas veces es mejor hacer que una aplicaci�n se acabe, y otras veces la aplicaci�n lo hace de cualquier manejar, como cuando hay un error de "out of memory". Generalmente, la aplicaci�n deber�a manejar una condici�n en vez de apagarse.

En esta lecci�n, imprimiremos mensajes de error en la consola, y crearemos una caja de di�logo desplegable que notifique al usuario sobre lo que ha sucedido. Como esta aplicaci�n lee texto en un �rea de texto desde un nombre de fichero, un fichero inexistente no garantiza que una aplicaci�n se acabe. En su lugar, la aplicaci�n avisa al usuario de que no se encontr� el fichero, y la aplicaci�n funciona de forma normal. El �rea de texto que se supone que contendr�a el texto aparecer� vac�a. En una aplicaci�n comercial manejar�amos este problema de forma diferente. Para prop�sitos de demostraci�n, permitimos que el error produzca una caja desplegable y que el marco de la aplicaci�n cargue un �rea de texto vac�a.

Creamos esta condici�n al no tener el fichero que la aplicaci�n trata de abrir. En la sentencia try asociamos un objeto BufferedReader con un fichero que no existe. Las clases FileReader y BufferedReader insisten en que manejemos una condici�n IOException que podr�a lanzarse.

Luego, manejamos la condici�n proporcionando una caja de di�logo desplegable creada desde la clase JOptionPane, e imprimimos un mensaje �til en la consola.

M�s adelante en el tutorial, cuando tengamos nuestro catch manejando c�digo en su lugar, crearemos el fichero que se est� solicitando. La aplicaci�n entonces lee el fichero y muestra el texto en el objeto que hemos creado, un �rea de texto.

.�C�digo en el bloque Catch

Hemos escrito el c�digo para el bloque try que intenta leer un fichero. Como el intento falla, el flujo se mueve al bloque catch. �Qu� proporcionamos para este bloque?

  • Abrimos un bloque catch con la palabra clave catch.
  • Le pasamos un objeto del tipo de excepci�n que esperamos.
  • Proporcionamos c�digo para lo que queremos que suceda cuando ocurra el error o la excepci�n.

Por ejemplo, aqu� podemos ver la s�ntaxis b�sica de un bloque catch:

catch (ExceptionType et)  {
   . . . C�digo que maneja la condici�n
         No tienes que hacer nada aqu�,
         pero puedes imprimir en la consola,
         proproporcionar caracter�siticas GUI, o corregir una 
         condici�n, como crear un fichero.
  }

Para determinar qu� tipo de objeto pasarle al bloque catch, buscamos en la documetnacio�n las clases que est�mos usando en el bloque try. Por ejemplo, las clases BufferedReader y FileReader contienen m�todos que lanzan excepciones.

La documentaci�n lista lo siguiente para el constructor de la clase FileReader:

Throws: FileNotFoundException - 
      if the specified file is not found

La documentaci�n lista lo siguiente para el m�todo readLine de la clase BufferedReader:

Throws: IOException - 
       If an I/O error occurs

Ahora que sabemos que clase pasar dentro de cada sentencia catch. Creamos tantos bloques cacth como sean necesarios. El compilador tambi�n nos dir� si hemos pasado una clase incorrecta o si necesitamos otro bloque catch porque alg�n m�todo que est�mos llamando necesita uno.

Sigue estos pasos...
  1. Abre el fichero NorthPanel.java en tu editor de texto.
  2. Despu�s del corchete de cierre del bloque try, a�ade el siguiente bloque catch:
     } // close try
    
     catch (FileNotFoundException fnfe) {//open catch
    
         } //close catch
    
  3. El c�digo de arriba crea un objeto para la FileNotFoundException. Para ver qu� tipo de mensaje de error proporciona este objeto, lo imprimimos en la consola a�adiendo la sentencia en negrita al bloque catch:
    } // close try
      catch (FileNotFoundException fnfe) {//open catch
           System.out.println(fnfe);
         } //close catch
    
  4. Tambi�n necesitamos estar preparados para un error IOException general. Si el fichero existe, pero por alguna raz�n no se puede leer, todav�a tenemos una condici�n que necesita ser manejada. A�adimos este bloque catch adicional:
     catch (IOException ioe) {//open catch
         System.out.println(ioe);
      }//close catch
    

.�Bloque finally

Hemos probado c�digo, despu�s de que haya fallado, hemos manejado la condici�n imprimiendo informaci�n de los objetos error en la consola. Estamos cubiertos en el caso de que el fichero no exista o no pueda ser le�do. En este �ltimo caso, el fichero podr�a haberse abierto, y debido a la condici�n de error se haya dejado abierto.

Siempre que intentemos abrir ficheros o conexiones a bases de datos, a�adimos un bloque finally para asegurarnos de cerrar todos los recursos. No importa lo ocurra en el c�digo, el flujo termina con la clausula finally, donde proporcionamos c�digo para limpiar los recursos, como cerrar un fichero o una conexi�n a una base de datos.

El bloque finally se ejecuta despu�s de que se hayan completado los bloques try/catch, sin importar si ha ocurrido o no una excepci�n. Usamos un bloque finally para manejar las excepciones no capturadas expl�citamente en el bloque catch, como un fichero abierto que necesita cerrarse.

Usamos la siguiente sintaxis para un bloque finally:

finally {
  ... c�digo de limpieza
 }
Sigue estos pasos...
  1. Abre el fichero NorthPanel.java en tu editor de texto.
  2. Despu�s del corchete de cierre del �ltimo bloque catch, a�ade el siguiente bloque:
    }//close catch
    finally { //Open finally
          if (br !=null) { // Open if
             try { // Open try
                br.close();
              } // Close try
             catch (Exception ignored) { // Open catch
              } // Close catch
            }// Closes if
         } // Close finally
    
  3. Compila el fichero con:
    javac NorthPanel.java

Este es un ejemplo de como deber�a estar tu clase ahora.

El bloque finally tambi�n contiene un bloque try/catch porque el m�todo close requiere que nos preparemos para una excepci�n. Adem�s, una sentencia if proporciona las condiciones en las se debe cerrar el fichero.

Aqu� est� lo que sucede en el bloque finally:

  • Si el objeto referido como br no es null, o existe en alg�n formato, llama al m�todo close sobre �l, en este caso es un fichero.
  • Cuando se llama al m�todo, si encuentra alg�n error o condici�n de alg�n tipo, crea un objeto Exception, pero lo ignora. No hay ning�n c�digo en este �ltimo bloque cath porque si no hay fichero, arriba se maneja la excepci�n, y se ejecuta la parte impl�cita de la sentenci if. Que es ...
  • Si el objeto br devuelve null, no hacemos nada.

Cuando ejecutamos la aplicaci�n, observa el mensaje que se imprime en la consola cuando se abre la aplicaci�n, informando de que no existe dicho fichero en el directorio. Usar System.out.println es �til para el desarrollador, pero no es muy amigable para el usuario final. Tenemos que hacer que System.out.println imprima algo m�s detallado, pero los componentes GUI son lo que los usuarios est�n acostumbrados a usar.

.�Desplegar Cajas de Di�logo

Las cajas de di�logo desplegables son �tiles componentes GUI que alertan al usuario sobre los problemas, le piden informaci�n o solicitan instrucciones. El API Swing propociona una clase JOptionPane que nos permite crear cajas de di�logos simples llamando a un m�todo est�tico, o crear di�logos m�s elaborados que contienen campos de texto y botones.

Para informar al usuario sobre un fichero inexistente, el m�todo showMessageDialog es suficiente. La clase JOptionPane tiene varios m�todos est�ticos interesantes:

  • showConfirmDialog: Solicita confirmaci�n a una pregunta, como Yes/No/Cancel.
  • showInputDialog: Solicita una entrada.
  • showMessageDialog: Informa al usuario de que algo ha sucedido.
  • showOptionDialog: Una combinaci�n de los tres anteriores.

Cuando una aplicaci�n se ejecuta y aparece un di�logo, no se puede realizar ninguna otra acci�n hasta que se cierre el di�logo, introduciendo alguna informaci�n, pulsando un bot�n, o cerrando la ventana del di�logo.

Para crear el di�logo, llamamos al m�todo showMessageDialog:

public static void showMessageDialog(
                 Component parentComponent,
                 Object message,
                 String title,
                 int messageType,
                 Icon icon) 
                     throws HeadlessException
Para llamar al m�todo est�tico showMessageDialog de la clase JOption, escribimos:
  A   JOption dialog = new JOption(); dialog.showMessageDialog();
  B.   JOptionPane.showMessageDialog( null, "File divedetails.txt not found.", null, JOptionPane.ERROR_MESSAGE );
  C   Ninguna de las anteriores.

COMPARTE ESTE ARTÍCULO

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

SIGUIENTE ARTÍCULO