我应该在throws子句中抛出Exception的子类型吗?

时间:2014-03-03 04:35:02

标签: java exception intellij-idea

我正在编写API

void doSomething(args) throws Exception1, Exception2;

Exception1是Exception2的子类型。

Intellij的想法是说“已经在投掷列表中有一个更普遍的例外。”我知道java只要求我在throws子句中使用Exception2但是我认为我应该在throws子句中同时用于文档目的,并向调用者指出他们可以分别捕获每个并为每个执行不同的操作。在我的API实现中,我抛出Exception1并调用一个抛出Exception2的内部方法。

建议的做法是什么?

感谢。

3 个答案:

答案 0 :(得分:6)

您应该编写一个javadoc来解释抛出每个特定异常时的条件。例如,看看ReadableByteChannel.read() javadoc - 该方法在其throws子句中仅声明了IOException,但在其javadoc中描述了该异常的许多更具体的子类。

答案 1 :(得分:5)

只需在throws Exception2子句中写throws即可。如果调用者在catch (Exception1 e)之前放置catch (Exception2 e),他们仍然可以单独捕获每个人。

例如,FileNotFoundExceptionIOException的子类型,可以写

try {
    doSomeStuff();
} catch (FileNotFoundException e) {
    System.out.println("There's no such file");
} catch (IOException e) {
    System.out.println("Your IO doesn't work");
}

即使doSomeStuff()仅被声明为投掷IOException。但你不能反过来做到这一点。在子类的子类之前使用超类的catch子句是无效的。

答案 2 :(得分:0)

Catch可能比名义上抛出的更具体,因此没有要求明确说明如果一个扩展另一个,你就扔掉了。这样做也没有坏处。根本不可能让另一个延伸到另一个......