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... |
---|
|
�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... |
---|
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: |
---|