为什么抛出向上转换检查的异常

Why throws upcasting checked exception

我注意到一些复杂库中的方法,包括标准 JDK,倾向于 throws 向上转换异常。起初我在Apache POI的源代码中发现了这种现象,后来在java.io.FileWriter中再次看到它是这样的:

public FileWriter(String fileName) throws IOException {
    super(new FileOutputStream(fileName));
}

其中 FileOutputStream 的实例化声明了此调用堆栈中唯一的已检查异常 FileNotFoundException。但是声明了IOException,是FileNotFoundException的超class。

那么这是什么原因呢?还是完全取决于程序员的习惯?

避免过于频繁地更改 API 可能是有意义的。
今天,一个方法可以在代码中抛出 IOexception 的子 class,但明天它可能抛出另一个。

虽然在签名中声明的父异常不是太笼统并且不会失去对客户的价值,但似乎可以为异常声明一个基础 class。
例如,一个糟糕的用法是声明 throw Exception,因为客户端无法理解异常的一般含义并因此处理它。