FileNotFoundException en Java

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.