为什么在读取文件时将我的文件放入带有 FileNotFoundException 的 try catch 中会起作用?

问题描述 投票:0回答:1

我的代码可以用于一项作业,但如果我不知道为什么会发生这种情况,这对我没有帮助,所以我在这里通过询问社区来尝试理解。

我正在尝试读取一个包含 3 行的简单文本文件,每行有一个 lorem ipsum 句子。没什么疯狂的。文件的名称是 myFile.txt,我的 java 类位于完全相同的文件夹中。路径指向两个文件所在的同一个文件夹。Java 不断告诉我,即使该文件位于确切的文件夹中,它也找不到我的文件。

本来我就有这个。

public void readFile()  {
    File file = new File("C:\\Users\\jovan\\Documents\\ACC\\java\\Java2-Kumi\\Program4 Files\\myFile.txt");
    Scanner myReader = new Scanner(file);

    while (myReader.hasNextLine()) {
        System.out.println(myReader.nextLine());
    }
}
  
Then VScode Code suggested that I do this instead as a Quick Fix


public void readFile()  {
    File file = new File("C:\\Users\\jovan\\Documents\\ACC\\java\\Java2-Kumi\\Program4 Files\\myFile.txt");
    try (Scanner myReader = new Scanner(file)) {
        while (myReader.hasNextLine()) {
            System.out.println(myReader.nextLine());
        }
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

After the quick fix it read the file exactly as is. 

Can someone please explain why the code worked after placing it in a try/catch?
java file try-catch filereader filenotfoundexception
1个回答
0
投票

Java 对于捕获异常非常严格。编译器知道

new Scanner(File source)
可以抛出
FileNotFoundException
,因此只有考虑到这一点,它才会让您编译代码。

如果它确实让你编译,你可能会得到一些非常讨厌的连锁反应。其他人可能会尝试使用您的方法并收到错误,甚至没有意识到这是他们必须担心的事情,这可能会导致很多挫败或困惑。

Java 为您提供了一些处理此问题的选项:

  1. 捕获或处理抛出异常的情况。这就是你所做的。
    try/catch
    块告诉编译器您知道可能会出现异常,如果出现异常,您将对其进行处理。
  2. 声明或告诉编译器代码可能会抛出异常。简而言之,这会将异常传递给任何想要调用您的方法的人。如果您想这样做,请取出
    try/catch
    块并添加
    throws
    语句:
public void readFile() throws FileNotFoundException {
    File file = new File("C:\\Users\\jovan\\Documents\\ACC\\java\\Java2-Kumi\\Program4 Files\\myFile.txt");
    Scanner myReader = new Scanner(file);
    while (myReader.hasNextLine()) {
        System.out.println(myReader.nextLine());
    }
}

throws
关键字告诉编译器您的方法可能会抛出给定的异常,这将使编译器迫使其他人小心您的方法,就像它迫使您小心这个方法一样。

并非所有例外情况都是如此。正如 @Rifat 所指出的,它仅适用于受检查的异常;未经检查的异常不需要如此明确地处理。

© www.soinside.com 2019 - 2024. All rights reserved.