2011-02-08 2 views
0

サブクラスではなく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()メソッドが(少なくとも今のところは)他のタイプの例外をスローしないことを確信しています。このようにしてもいいですか?

NoWaterExceptionNoSoilExceptionNoSunshineExceptionTreePlantExcetpionのサブクラスにすることはできません。それらは同じ継承階層にはありません。

重要なのは、例外処理がすべてのキャッチされた例外に対して同じであれば、代わりにjava.lang.Exceptionというスーパークラスをキャッチするだけですか?

答えて

2

TreePlantExceptionのNoWaterExceptionNoSoilExceptionNoSunshineExceptionサブクラスを作成し、スローとしてTreePlantExceptionは既に宣言されているので、あなただけの全体のtry/catchをスキップすることができます。

+0

クラスが継承階層にない場合はどうなりますか? – chance

+0

次に、特定の例外を個別にキャッチするか、最初の共通のスーパークラスをキャッチする必要があります。後者のアプローチでの問題は、何かがNullPointerExceptionまたはArrayIndexOutOfBoundsExceptionなどを投げてしまい、食べてしまったような場合です。 – bjornars

関連する問題