サブクラスではなくjava.lang.Exceptionを捕まえることができますか?具体的なサブクラスではなくjava.lang.Exceptionを捕まえることができますか?
このsenarioを考えてみましょう:
public class Tree {
public static Tree newInstance() throws NoWaterException, NoSoilException, NoSunshineException {
...
return new Tree();
}
}
私はツリーのインスタンスを取得したい場合は、私はこれを行うことができます。
public Tree plantTree() throws TreePlantExcetpion {
try {
...
return Tree.newInstance();
} catch (NoWaterException e) {
throw new TreePlantExcetpion("Cannot plant a tree since no water", e);
} catch (NoSoilException e) {
throw new TreePlantExcetpion("Cannot plant a tree since no soil", e);
} catch (NoSunshineException e) {
throw new TreePlantExcetpion("Cannot plant a tree since no sunshine", e);
}
}
しかし、私はまた、代わりにこれを行うことができます:
public Tree plantTree() throws TreePlantExcetpion {
try {
...
return Tree.newInstance();
} catch (Exception e) {
throw new TreePlantExcetpion("Cannot plant a tree", e);
}
}
を
私はメソッドplantTree
()の2番目の実装よりも短く、クリアrであり、このメソッドではException
の具象サブクラスについては気にしません。私がする必要があるのは、新しいTreePlantExcetpion
にラップして渡すことです。すべての詳細情報は失われません。そして、私はTree.newInstance()メソッドが(少なくとも今のところは)他のタイプの例外をスローしないことを確信しています。このようにしてもいいですか?
注:NoWaterException
、NoSoilException
、NoSunshineException
はTreePlantExcetpion
のサブクラスにすることはできません。それらは同じ継承階層にはありません。
重要なのは、例外処理がすべてのキャッチされた例外に対して同じであれば、代わりにjava.lang.Exception
というスーパークラスをキャッチするだけですか?
クラスが継承階層にない場合はどうなりますか? – chance
次に、特定の例外を個別にキャッチするか、最初の共通のスーパークラスをキャッチする必要があります。後者のアプローチでの問題は、何かがNullPointerExceptionまたはArrayIndexOutOfBoundsExceptionなどを投げてしまい、食べてしまったような場合です。 – bjornars