Programación en castellano
Inicio > Tutoriales > Lenguajes orientados a objeto > Nuevo en Java > New 2 Java: Construir una Aplicación: 4.- Leer y Escribir Ficheros y Manejar Excepciones
-Tutoriales

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


Manejar las Excepciones Lanzadas

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.
 
Patrocinados
 

Copyright © 1999-2007 Programación en castellano. Todos los derechos reservados.
Formulario de Contacto - Datos legales - Publicidad
Mantenida por: Claudio y Dani.

Hospedaje web y servidores dedicados linux por Ferca Network

red internet: jugar gratis | amor | navidad 2009 | registro de dominios | servidores dedicados
más internet: comprar | gratis | posicionamiento en buscadores | decoración libre | gifs animados