【问题标题】:Declare method to throw an exception and subclass of this exception声明抛出异常的方法和该异常的子类
【发布时间】:2012-06-20 09:45:58
【问题描述】:

声明一个方法抛出异常有意义吗 和这个异常的一个子类, 例如IOException 和 FileNotFoundException?

我猜想它是用来通过调用者方法以不同方式处理这两种异常的。 但是,如果方法仅抛出最通用的异常,即 IOException,是否可以同时处理这两个异常?

【问题讨论】:

    标签: java exception-handling


    【解决方案1】:

    但是,如果方法只抛出最通用的异常,即 IOException,是否可以同时处理这两个异常?

    当然。你仍然可以单独捕捉它们:

    try {
      methodThrowingIOException();
    } catch (FileNotFoundException e) {
      doSomething();
    } catch (IOException e) {
      doSomethingElse();
    }
    

    因此,如果方法同时声明两者,调用者 可以 做的事情没有区别 - 这是多余的。但是,它可以强调您可能要考虑的例外情况。这可以在 Javadoc 中完成,而不仅仅是 throws 声明。

    【讨论】:

    • 为什么 Javadoc 比代码更好?通常代码比 cmets 更可取,异常是异常吗?
    • @Mark:这不是而不是代码。它是以及 throws 声明。但是您需要 throws 声明才能记录特定异常 (IIRC)。关键是 just 使用 throws 声明不允许您给出任何解释 - 而 javadoc 可以。
    【解决方案2】:

    声明一个抛出异常的方法和这个异常的子类是否有意义,例如IOException 和 FileNotFoundException?

    通常不会 - 我知道的大多数 IDE 甚至会针对此类声明发出警告。您可以而且应该做的是记录 Javadoc 中抛出的不同异常。

    但是,如果方法只抛出最通用的异常,即 IOException,是否可以同时处理这两个异常?

    是的,您只需要确保 catch 块的顺序正确,即首先更具体。 Catch 块按照它们定义的顺序进行评估,所以在这里

    try {
      ...
    } catch (FileNotFoundException e) {
      ...
    } catch (IOException e) {
      ...
    }
    

    如果抛出的异常是FileNotFoundException,则会被第一个catch块捕获,否则会掉到第二个并作为一般IOException处理。相反的顺序将不起作用,因为catch (IOException e) 将捕获所有IOExceptions,包括FileNotFoundException。 (事实上​​,后者会导致编译错误 IIRC。)

    【讨论】:

      【解决方案3】:

      但是,如果方法只抛出最通用的异常,即 >IOException,是否可以同时处理这两个异常?

      catch(IOException ex){
       if(ex instanceof FileNotFoundException){}
      }
      

      但这看起来不太干净,抛出两个异常看起来不错,甚至调用者也会知道这个方法可能会抛出这些异常,所以他们会正确处理它

      【讨论】:

      • 你说得对,它并不干净——但也没有必要。请参阅我的回答和 Karthik 的回答。基本上没必要这么丑。
      • @Jon 如果我们声明抛出 IOException 的方法,那么调用者怎么会知道它也可以引发 FileNotFoundException ?
      • 它不是“也” - FileNotFoundException is 一个 IOException,因此如果方法声明它抛出 IOException,您总是可以尝试捕获它。由文档来指定在什么情况下会发生。
      【解决方案4】:

      是的,如果方法只抛出 IOException,则可以同时处理这两种情况。

      回答此类问题的最佳方法是编写一个测试来演示并尝试一下。让JVM告诉你答案。比在这里问要快。

      【讨论】:

      • 其实回复的速度比我写一个测试课还要快。我的问题还有另一部分,我希望它对其他人也有用。
      【解决方案5】:

      是的。当某些特殊异常可以正确处理时。是,如果您按以下方式处理异常:

      try {
      } catch (FileNotFoundException f) {
      //Try a different file
      } catch (IOException ioe) {
      //Fatal, Maybe bad blocks ... Bail out... 
      } catch (Exception e) {
      //Something went wrong, see what it is...
      }
      

      【讨论】:

        【解决方案6】:

        声明,该方法可能会抛出(更多通用)IOException,和(更多特定)FileNotFoundException 通常是一件好事 - 这是一个附加信息供以后使用您的代码的人使用。请注意,您应该在 JavaDoc 中明确说明,在什么情况下会引发每个异常。

        他们仍然能够区分异常,并使用像这样的 catch 构造以不同方式处理它们:

        try {
            yourAwesomeMethod()
        } catch (FileNotFoundException ex) {
            // handle file-not-found error
        } catch (IOException ex) {
            // handle other IO errors
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-28
          • 1970-01-01
          • 2011-04-23
          • 2021-04-20
          • 1970-01-01
          • 2023-03-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多