2

我有一个实现以下接口的基类,在其上声明的方法抛出基本异常类型Exception

有许多扩展基类的具体类,我不想在所有这些类中添加一个try-catch。有throws没有不添加的方法来处理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并将其扔到基类的 try catch 块中?

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 MyException {
    try{
    //codes 
    }catch(Exception e) {
     throw new MyException();
    }


    return jObj.toString();
}
}

class MyException extends RuntimeException {
}
于 2013-03-08T14:11:18.480 回答
0

如果您抛出 RuntimeException,则无需添加 throws 声明。因此,例如,您可以创建自己的 RuntimeException,例如

 class NewException extends RuntimeException{

  }

然后,当您将 RuntimeException 添加到您的 BaseClass 时,所有其他方法都不必声明将调用这些方法的 throws。

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

于 2013-03-08T14:12:14.610 回答