1. Introducción
En este artículo, hablaremos sobre una excepción muy común en Java: FileNotFoundException .
Cubriremos los casos en los que puede ocurrir, las posibles formas de tratarlo y algunos ejemplos.
2. ¿Cuándo se lanza la excepción?
Como se indica en la documentación de la API de Java, esta excepción se puede lanzar cuando:
- Un archivo con el nombre de ruta especificada no no existe
- Un archivo con el nombre de ruta especificada hace existir , pero es inaccesible por alguna razón (por escrito solicitado un archivo de sólo lectura, o permisos no permiten acceder al archivo)
3. ¿Cómo manejarlo?
En primer lugar, teniendo en cuenta que se extiende java.io.IOException que se extiende java.lang.Exception , que tendrá que tratar con él con un try-catch bloque al igual que con cualquier otra E comprobado Xception .
Entonces, qué hacer (relacionado con el negocio / lógica) dentro del bloque try-catch en realidad depende de lo que necesite hacer.
Es posible que necesite:
- Genere una excepción específica de la empresa: esto puede ser un error de detención de ejecución, pero dejará la decisión en las capas superiores de la aplicación (no olvide incluir la excepción original)
- Alerta a un usuario con un diálogo o mensaje de error: esto no es un error de detención de ejecución, por lo que solo notificar es suficiente
- Crear un archivo: leer un archivo de configuración opcional, no encontrarlo y crear uno nuevo con valores predeterminados
- Cree un archivo en otra ruta: necesita escribir algo y si la primera ruta no está disponible, intente con una a prueba de fallas
- Simplemente registre un error: este error no debería detener la ejecución, pero debe registrarlo para un análisis futuro
4. Ejemplos
Ahora veremos algunos ejemplos, todos los cuales estarán basados en la siguiente clase de prueba:
public class FileNotFoundExceptionTest { private static final Logger LOG = Logger.getLogger(FileNotFoundExceptionTest.class); private String fileName = Double.toString(Math.random()); protected void readFailingFile() throws IOException { BufferedReader rd = new BufferedReader(new FileReader(new File(fileName))); rd.readLine(); // no need to close file } class BusinessException extends RuntimeException { public BusinessException(String string, FileNotFoundException ex) { super(string, ex); } } }
4.1. Registro de la excepción
Si ejecuta el siguiente código, "registrará" el error en la consola:
@Test public void logError() throws IOException { try { readFailingFile(); } catch (FileNotFoundException ex) { LOG.error("Optional file " + fileName + " was not found.", ex); } }
4.2. Plantear una excepción específica de la empresa
A continuación, un ejemplo de cómo generar una excepción específica de la empresa para que el error se pueda manejar en las capas superiores:
@Test(expected = BusinessException.class) public void raiseBusinessSpecificException() throws IOException { try { readFailingFile(); } catch (FileNotFoundException ex) { throw new BusinessException( "BusinessException: necessary file was not present.", ex); } }
4.3. Crear un archivo
Finalmente, intentaremos crear el archivo para que se pueda leer (tal vez para un hilo que lee continuamente un archivo), pero nuevamente detectando la excepción y manejando el posible segundo error:
@Test public void createFile() throws IOException { try { readFailingFile(); } catch (FileNotFoundException ex) { try { new File(fileName).createNewFile(); readFailingFile(); } catch (IOException ioe) { throw new RuntimeException( "BusinessException: even creation is not possible.", ioe); } } }
5. Conclusión
En este artículo rápido, hemos visto cuándo puede ocurrir una excepción FileNotFoundException y varias opciones para manejarla.
Como siempre, los ejemplos completos terminaron en Github.