3

我知道下面的代码确实有意义:

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

但是在throws 子句中声明那些父子异常有意义吗?

假设我有以下代码:

public void doSomething() throws FileNotFoundException, IOException { ... }

我们都知道那FileNotFoundExceptionIOException. 现在以任何方式(可读性,性能等)声明它是否有意义,反对只是这样:

public void doSomething() throws IOException { ... }
4

2 回答 2

6

对于 Java 编译器,子类是否在throws子句中并不重要,因为超类异常会覆盖它。

但是,出于文档目的,它很重要。您的方法的调用者可能想知道它可以抛出一个子类异常,例如FileNotFoundException,并以不同的方式处理它。

try {
    doSomething();
}
catch (FileNotFoundException e) {
    System.out.println("File not found!");
}
catch (IOException e) {
    System.out.println("An I/O error has occurred: " + e.getMessage());
}
于 2014-08-15T16:22:29.067 回答
1

有时捕获两个异常是有意义的,只要首先指定子类异常(否则,我认为它甚至不会编译)。它允许您以与更一般的异常不同的方式处理您关心的特定异常。

例如,我有从套接字读取的代码。这是一个阻塞读取,我设置了一个超时,因为可能没有什么可读取的。这就是为什么我抓住它而不SocketTimeoutException做任何事情。另一方面,如果我得到其他IOExceptions (IOException作为 的间接超类SocketTimeoutException),我将抛出异常,因为在尝试从套接字读取时发生了真正的失败。

    catch (SocketTimeoutException ignEx) {
// -- ignore exception, as we are expecting timeout exceptions because
// -- there might be nothing to read
    }
    catch (IOException ioEx) {
      throw new SomeException (...);
    }

至于在方法签名中声明两者,则不必在throws子句中声明两者,但如果您在 JavaDoc 注释中记录这两个异常,并描述它们中的每一个的条件,这将对您的方法的用户有用被抛出。

于 2014-08-15T16:19:43.853 回答