我的代码可以用于一项作业,但如果我不知道为什么会发生这种情况,这对我没有帮助,所以我在这里通过询问社区来尝试理解。
我正在尝试读取一个包含 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 对于捕获异常非常严格。编译器知道
new Scanner(File source)
可以抛出 FileNotFoundException
,因此只有考虑到这一点,它才会让您编译代码。
如果它确实让你编译,你可能会得到一些非常讨厌的连锁反应。其他人可能会尝试使用您的方法并收到错误,甚至没有意识到这是他们必须担心的事情,这可能会导致很多挫败或困惑。
Java 为您提供了一些处理此问题的选项:
try/catch
块告诉编译器您知道可能会出现异常,如果出现异常,您将对其进行处理。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 所指出的,它仅适用于受检查的异常;未经检查的异常不需要如此明确地处理。