...しかし、すべての関数でキャッチを使用する代わりに、これらを使用する意味がわかりません。
重要なのは、呼び出しスタックの次の関数が例外の処理方法を知らない可能性があるということです。例:
public class Test {
public Object doSomething(String source) throws IOException {
try (InputStream is = openAsStream(source)) {
// ... read and process stuff
return ...
}
}
public InputStream openAsStream(String name) throws IOException {
String fileName = // ... do something with 'name'
return new FileInputStream(name);
}
public static void main(String[] args) {
// ...
Test t = new Test();
try {
t.doSomething(args[0]);
} catch (IOException ex) {
System.err.println("Cannot handle '" + args[0] + "'");
}
}
}
。をスローする可能性openAsStream
のあるコンストラクターを呼び出します。メソッドはこれから回復できないため、伝播させます。メソッドもそれを処理する方法を知らないので、それはそれが伝播することを可能にします。最後に、例外は...に到達します。これは、ユーザーに問題を説明する方法を知っています。FileInputStream
IOException
openAsStream
doSomething
main
openAsStream
これで、をキャッチしIOException
、エラーメッセージを出力して、を返すように記述できますnull
。しかし、それは大きな間違いです。
重要なのは、メソッドはそのレベルで適切に処理できる例外のみを処理する必要があるということです。他のものは繁殖することを許可されるべきです。(または、別の例外にラップされている可能性があります...それがAPI設計に必要な場合)。