【问题标题】:when to throw FileNotFoundException何时抛出 FileNotFoundException
【发布时间】:2015-12-28 00:17:50
【问题描述】:

我在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() 出现错误。看来我还需要在main 的标头中抛出异常。为什么我需要在mainreadFile() 的两个标头中都抛出异常?

【问题讨论】:

  • 你需要抓住它,而不是扔掉它。
  • 你想通过传播这个异常来达到什么目的?
  • 因为 main 调用 readFile,并且如果 readFile 抛出 FileNotFound 异常,那么如果 main 没有捕获它,它将传播异常。因此,您要么需要在 main 中捕获异常,要么声明它可以抛出一个异常,尽管是间接的。
  • 我认为您将人们与“为什么我需要抛出异常”混淆:我认为您的意思是“为什么我需要声明 main 可以抛出异常”

标签: java


【解决方案1】:

Java 对其异常存在一些争议。它有两类例外。检查和未检查。任何从 RuntimeException 或 Error 扩展的异常都是未经检查的,不需要在方法签名中被捕获或显式声明为可抛出。

然而,FileNotFound 是一个检查异常,必须在方法签名中被捕获或声明为可抛出。

基本思想是,已检查的异常是您可以从中恢复的异常,而未检查的异常是来自编程中最有可能无法恢复的错误的异常。

您可以在这里阅读所有相关信息:https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html

【讨论】:

    【解决方案2】:

    throws 关键字视为一个承诺;你是说你现在不会捕获异常,但你会在调用语句中捕获它。

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

    【讨论】:

      【解决方案3】:

      您处理Exceptions 的选项是捕获它们并立即处理它们,或者将它们扔到函数中并将异常传播到函数的调用者。

      对于maincatch 并在那里处理异常是有意义的。

      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 中抛出异常,但在那之后,如果出现故障,您是否有“备份”真的很重要。如需更多信息,this question 提供了非常详细的信息。

      【讨论】:

        【解决方案4】:

        在 main 方法中抛出异常是没有意义的——这是程序的入口点,这意味着没有其他方法会捕获这个异常并处理它。您应该在此处捕获并处理异常 - 要么记录错误,向用户提供明确的消息,要么读取其他文件,但在这里抛出异常是错误的。

        【讨论】:

        • 如果其他Java类调用main怎么办?
        • @MadProgrammer - 那么这是糟糕的编程,不应该这样做(恕我直言)。 main 是一个入口点,不应在内部调用
        • 尽管如此,它已经完成了,只是因为我们认为它是坏的并不能阻止它的发生,实际上可能是有意为之的。您可以从main 抛出异常,JVM 会处理它(就像处理未捕获的异常一样),但这需要更多细节;) - 我个人的偏好是在main 方法中处理它,但是,这并不总是可能的
        【解决方案5】:

        你需要捕获异常

        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
           }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-06-19
          • 2020-07-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多