何时抛出FileNotFoundException?

5

我在main方法中调用了一个名为readFile()的方法,readFile()会抛出FileNotFoundException异常,但是main方法没有处理该异常,代码如下:

public static void main(String[] args){
    readFile();
}

public static void readFile() throws FileNotFoundException{
    Scanner input = new Scanner(new File("file.txt"));
    ...
}

当我编译程序时,在main方法中的readFile()出现了错误。看起来我也需要在mainreadFile()的头部抛出异常。为什么我需要在mainreadFile()的头部都抛出异常?

7
你需要抓住它,而不是扔掉它。 - Drew Kennedy
2
通过传播这个异常,你想要实现什么目的? - PM 77-1
1
因为main调用了readFile,如果readFile抛出了FileNotFound异常,那么如果不捕获它,main将会向上传播该异常。因此,你要么需要在main中捕获这个异常,要么声明它可能会间接地抛出一个异常。 - Rup
3
我认为你在用“为什么需要抛出异常”这个问题混淆了人们:我想你的意思是“为什么需要声明主函数可能会抛出异常”。 - Rup
5个回答

8
Java的异常处理存在争议。它有两种异常类:已检查的和未检查的。任何继承自RuntimeException或Error的异常都是未检查的,不需要在方法签名中捕获或明确声明为可抛出的。
但是,FileNotFoundException是一种已检查的异常,必须要么被捕获,要么在方法签名中声明为可抛出的异常。
基本思想是,已检查的异常是您可能能够从中恢复的异常,而未检查的异常则来自于编程中最有可能无法恢复的错误。
您可以在此处阅读更多信息:https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html

5

throws关键字视为一个承诺;你正在表示你现在不会捕捉异常,但你会在调用语句时捕捉它。

你当前在readFile方法中的代码似乎完全有效,但你需要在调用语句中使用try-catch来适当地处理异常。


4

处理 异常 的选项是立即捕获并处理它们,或在函数中抛出并将异常传递到函数的调用方。

对于 main 函数,捕获并在那里处理异常是有意义的。

public static void main(String[] args){
  try {
    readFile();
  } catch (FileNotFoundException e) {
    // Do something with `e`
  }
}

public static void readFile() throws FileNotFoundException {
  Scanner input = new Scanner(new File("file.txt"));
  // ...
}

然而,你也可以像这样做:
public static void main(String[] args){
  readFile();
}

public static void readFile() {
  try {
    Scanner input = new Scanner(new File("file.txt"));
    // ...
  } catch (FileNotFoundException e) {
    // Do something with `e` or handle it accordingly.
  }
}

我建议不要在main函数中抛出异常,但除此之外,这取决于你是否有备用方案以应对故障。欲了解更多信息,这个问题有很好的详细说明。


1

在主方法中抛出异常没有意义 - 这是程序的入口点,这意味着没有其他方法会捕获并处理此异常。你应该在这里捕获和处理异常 - 可以记录错误、向用户提供清晰的消息、读取其他文件等,但在此处抛出异常是错误的。


3
如果其他Java类调用了main,会发生什么? - MadProgrammer
@MadProgrammer - 这是糟糕的编程实践,不应该这样做(在我看来)。main函数是一个入口点,不应该在内部调用。 - Nir Levy
1
尽管我们认为它不好,但事情仍然会完成,而且实际上可能是有意为之。您可以从main中抛出异常,JVM将处理它(就像处理未捕获的异常一样),但这需要更多的细节;) - 我个人偏好于在main方法中处理它,但这并非总是可能的。 - MadProgrammer

1

你需要捕获异常

public static void main(String[] args){
    readFile();
}

public static void readFile() {
   try {
      Scanner input = new Scanner(new File("file.txt"));
      ...
   } catch (FileNotFoundException ex) {
      // Error message
   } catch (Exception ex) {
      // Incase a different exception is caught
   }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接