2

次のインターフェイスを実装する基本クラスがあり、その上で宣言されたメソッドは基本的な例外タイプをスローしますException

基本クラスを拡張する具体的なクラスはたくさんありますが、それらすべてにブロックを追加したくありません。try-catchthrows追加せずに処理する方法はありtry-catchますか?

インターフェース

public interface IReportFactory {   
    public Object GetDataFromDB(Connection conn,HashMap<String,String> map) throws  Exception;        
    public Object  GetJSONString(HashMap<String,String> map) throws Exception;
}

基本クラス

public abstract class BaseReport implements IReportFactory{        
    public Connection conn;
    public String acctId = FactoryReport.getAcctId();


    ------ I WANT TO CATCH EXCEPTION HERE    ------
    ------ WHICH ACCURS IN OTHER CLASSES WHICH EXTENDS FROM THIS CLASSES -----


}

具体的なクラスの例(30個あります)

public class GeneralRevenue extends BaseReport {
    private final Logger logger = Logger.getLogger(GeneralRevenue.class);

     public GeneralRevenue(Connection _conn) {  
        this.conn = _conn;
    }

    @Override
    public Object GetJSONString(HashMap<String,String> params) throws Exception {

        //codes 
        return jObj.toString();
    }

    @Override
    public Object GetDataFromDB(Connection conn,HashMap params) throws Exception {

        //codes 
        return RevenueList;
    }
}
4

3 に答える 3

5

インターフェースを拡張しているからといって、 を追加する必要があるわけではありませんthrows Exception。インターフェースよりも少ない例外をスローするように実装クラスを宣言してもかまいません。実装がインターフェイスよりも広範な例外をスローするようにすることはできません。

したがって、次のように throws 句なしでメソッドを定義できます。

public Object GetJSONString(HashMap<String,String> params) {

チェックされた例外がスローされた場合は、チェックされていない例外として再スローできます。

サブクラスによってスローされた例外をキャッチしたい場合は、コードを再編成して、サブクラスのメソッドがスーパー クラスによって呼び出されるようにする必要があります。そうしないと、スーパー クラスが何かをキャッチする機会がありません。ストラテジーを使用することが理にかなっているのかどうかを検討することもできます (これにより、ストラテジーへの呼び出しをラップでき、実行する必要がある継承の量を減らすことができます)。

多くの場合、開発者は継承を拡張の優先手段として使用しますが、(私たちは常に急いでいるため) 懸念事項を分離しておくことについてあまり考慮されておらず、その結果、複雑で柔軟性のないコードが作成されています。これをさまざまな責任の線に沿って分割すると、複雑さが軽減され、おそらく例外がスローされる状況が改善される可能性があります。

于 2013-03-08T14:03:03.077 に答える
0

RuntimeException をスローする場合は、throws 宣言を追加する必要はありません。したがって、例として、次のような独自の RuntimeException を作成します

 class NewException extends RuntimeException{

  }

次に、RuntimeException を BaseClass に追加すると、他のすべてのメソッドは、これらのメソッドを呼び出すスローを宣言する必要がなくなります。

http://docs.oracle.com/javase/6/docs/api/java/lang/RuntimeException.html

于 2013-03-08T14:12:14.610 に答える