Saltar al contenido

Java dice FileNotFoundException pero el archivo existe

Esta crónica fue probado por nuestros especialistas así aseguramos la veracidad de nuestro contenido.

Hay una situación numérica en la que un FileNotFoundException puede lanzarse en tiempo de ejecución.

  1. El archivo nombrado no existe. Esto podría deberse a varias razones, entre ellas:

    • El nombre de la ruta es simplemente incorrecto.
    • El nombre de la ruta parece correcto, pero en realidad es incorrecto porque contiene caracteres que no se imprimen (u homoglifos) que no notó
    • El nombre de ruta es relativo y no se resuelve correctamente en relación con el real directorio actual de la aplicación en ejecución. Esto suele suceder porque el directorio actual de la aplicación no es lo que espera o supone.
    • La ruta al archivo está rota; por ejemplo, un nombre de directorio de la ruta es incorrecto, un enlace simbólico en la ruta está roto o hay un problema de permisos con uno de los componentes de la ruta.
  2. El archivo nombrado es en realidad un directorio.

  3. El archivo mencionado no se puede abrir para leer por algún motivo.

La buena noticia es que el problema se inevitablemente ser uno de los anteriores. Solo es cuestión de averiguar cuál. Aquí hay algunas cosas que puedes probar:

  • Vocación file.exists() le dirá si existe algún objeto del sistema de archivos con el nombre / nombre de ruta dado.
  • Vocación file.isDirectory() probará si es un directorio.
  • Vocación file.canRead() probará si es un archivo legible.
  • Esta línea le dirá cuál es el directorio actual:

    System.out.println(new File(".").getAbsolutePath());
    
  • Esta línea imprimirá el nombre de la ruta de manera que sea más fácil detectar cosas como espacios en blanco iniciales o de entrenamiento inesperados:

    System.out.println("The path is '" + path + "'");
    

    Busque espacios inesperados, saltos de línea, etc. en la salida.


Resulta que su código de ejemplo tiene un error de compilación.

Ejecuté su código sin ocuparme de la queja de Netbeans, solo para obtener el siguiente mensaje de excepción:

Excepción en el subproceso “principal” java.lang.RuntimeException: código fuente no compilable: excepción no notificada java.io.FileNotFoundException; debe ser atrapado o declarado para ser lanzado

Si cambia su código a lo siguiente, se arreglará ese problema.

public static void main(String[] args) throws FileNotFoundException     
    File file = new File("scores.dat");
    System.out.println(file.exists());
    Scanner scan = new Scanner(file);

Explicación: el Scanner(File) constructor se declara como lanzando el FileNotFoundException excepción. (Sucede que el escáner no puede abrir el archivo). Ahora FileNotFoundException es un excepción comprobada. Eso significa que un método en el que la excepción tal vez arrojado deber capturar la excepción o declararla en el throws cláusula. La solución anterior adopta el último enfoque.

El código en sí funciona correctamente. El problema es que la ruta de trabajo del programa apunta a un lugar diferente al que crees.

Use esta línea y vea dónde está el camino:

System.out.println(new File(".").getAbsoluteFile());

Obviamente, hay varias causas posibles y las respuestas anteriores las documentan bien, pero así es como resolví esto en un caso particular:

Un estudiante mío tuvo este problema y casi me arranco el pelo tratando de resolverlo. Resultó que el archivo no existía, aunque parecía que sí. El problema era que Windows 7 estaba configurado para “Ocultar extensiones de archivo para tipos de archivos conocidos”. Esto significa que si el archivo parece tener el nombre “data.txt” es real el nombre del archivo es “datos.txt.txt”.

Espero que esto ayude a otros a ahorrarse algo de cabello.

Finalizando este artículo puedes encontrar las reseñas de otros administradores, tú asimismo tienes la libertad de mostrar el tuyo si te gusta.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *