我有一个实现以下接口的基类,在其上声明的方法抛出基本异常类型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;
}
}
答案 0 :(得分:5)
仅仅因为你扩展接口并不意味着你必须添加throws Exception
,所以可以将实现类声明为抛出比接口更少的异常。你不能让实现抛出比界面更广泛的例外。
所以你可以在没有throws子句的情况下定义你的方法,比如:
public Object GetJSONString(HashMap<String,String> params) {
如果抛出任何已检查的异常,您可以将其重新抛出为未经检查的异常。
如果要捕获子类抛出的异常,则必须重新排列代码,以便超类调用子类的方法,否则超类没有机会捕获任何内容。您可能会考虑使用策略是否有意义(这可以让您包含对策略的调用,并可能减少您必须执行的继承量)。
发生了很多事情的是开发人员使用继承作为他们首选的扩展方式,并且(因为我们总是匆忙)没有太多关于保持关注点分离的想法,结果是代码复杂而且不灵活。在不同的责任范围内打破这一点可能有助于减少这种不那么复杂的事情,并可能有助于抛出异常情况,因为不同的部分会更好地集中,并且可能会抛出不那么广泛的例外。
答案 1 :(得分: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 {
}
答案 2 :(得分:0)
如果抛出RuntimeException,则无需添加throws声明。因此,对于您的示例,您可以创建自己的RuntimeException,如
class NewException extends RuntimeException{
}
然后,当您向BaseClass添加RuntimeException时,所有其他方法都不必声明将调用这些方法的throws。
http://docs.oracle.com/javase/6/docs/api/java/lang/RuntimeException.html