Java 说 FileNotFoundException 但文件存在

新手上路,请多包涵

我的 CS 课有一个作业,上面写着要读取一个包含多个考试成绩的文件,并要求我对它们求和并取平均值。虽然求和和求平均值很容易,但我在读取文件时遇到了问题。讲师说要使用这种语法

Scanner scores = new Scanner(new File("scores.dat"));

但是,这会抛出一个 FileNotFoundException ,但我一遍又一遍地检查该文件是否存在于当前文件夹中,之后,我认为它必须对权限做一些事情。我给大家改了读写权限,还是不行,还是一直报错。有谁知道为什么会发生这种情况?

编辑:它实际上指向一个目录,但是,我已经解决了这个问题。 Now file.exists() returns true , but when I try to put it in the Scanner , it throws the FileNotFoundException

这是我所有的代码

import java.util.Scanner;
import java.io.*;
public class readInt{
        public static void main(String args[]){
                File file = new File("lines.txt");
                System.out.println(file.exists());
                Scanner scan = new Scanner(file);
        }
}

原文由 scrblnrd3 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

在许多情况下,可能会在运行时抛出 FileNotFoundException

  1. 指定的文件不存在。这可能有多种原因,包括:

    • 路径名完全错误
    • 路径名看起来正确但实际上是错误的,因为它包含您没有注意到的非打印字符(或同形文字)
    • 路径名是相对的,它不能相对于正在运行的应用程序的 实际 当前目录正确解析。这通常是因为应用程序的当前目录不是您期望或假设的目录。
    • 文件路径已损坏;例如,路径的目录名称不正确,路径上的符号链接已损坏,或者其中一个路径组件存在权限问题。
  2. 命名文件实际上是一个目录。

  3. 由于某种原因无法打开指定文件进行读取。

好消息是,问题将 不可避免地 成为上述问题之一。这只是解决哪个问题。您可以尝试以下操作:

  • 调用 file.exists() 将告诉您是否存在具有给定名称/路径名的任何文件系统对象。

  • 调用 file.isDirectory() 将测试它是否是一个目录。

  • 调用 file.canRead() 将测试它是否是一个可读文件。

  • 这一行会告诉你当前目录是什么:

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

  • 此行将以一种更容易发现意外前导或尾随空格等内容的方式打印出路径名:
     System.out.println("The path is '" + path + "'");

在输出中查找意外的空格、换行符等。


事实证明,您的示例代码存在编译错误。

我在没有处理 Netbeans 的投诉的情况下运行了您的代码,只是为了得到以下异常消息:

线程“main”中的异常 java.lang.RuntimeException:无法编译的源代码 - 未报告的异常 java.io.FileNotFoundException;必须被抓住或宣布被抛出

如果您将代码更改为以下内容,它将解决 问题。

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

_解释_: Scanner(File) 构造函数被声明为抛出 FileNotFoundException 异常。 (碰巧扫描仪无法打开文件。)现在 FileNotFoundException 是一个已 _检查的异常_。这意味着 可能 抛出异常的方法 必须 捕获异常或在 throws 子句中声明它。上述修复采用后一种方法。

原文由 Terry Li 发布,翻译遵循 CC BY-SA 4.0 许可协议

代码本身工作正常。问题是,程序工作路径指向的地方比你想象的要多。

使用这一行并查看路径在哪里:

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

原文由 libik 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题