Java 如何抓住;“抛出异常”;不使用try-catch块?
我有一个实现以下接口的基类,上面声明的方法抛出基本异常类型Java 如何抓住;“抛出异常”;不使用try-catch块?,java,design-patterns,try-catch,Java,Design Patterns,Try Catch,我有一个实现以下接口的基类,上面声明的方法抛出基本异常类型exception 有许多具体的类扩展了基类,我不想在所有这些类中添加try-catchblock。有没有一种方法可以处理抛出而不添加try catch 接口 public interface IReportFactory { public Object GetDataFromDB(Connection conn,HashMap<String,String> map) throws Exception;
exception
有许多具体的类扩展了基类,我不想在所有这些类中添加try-catch
block。有没有一种方法可以处理抛出
而不添加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;
}
混凝土类示例(共30个)
公共类一般收入扩展BaseReport{
私有最终记录器=Logger.getLogger(GeneralRevenue.class);
公共一般收入(连接)
this.conn=_conn;
}
@凌驾
公共对象GetJSONString(HashMap参数)引发异常{
//代码
返回jObj.toString();
}
@凌驾
公共对象GetDataFromDB(连接连接,HashMap参数)引发异常{
//代码
回归复仇者;
}
}
扩展接口并不意味着必须添加抛出异常
,可以将实现类声明为抛出的异常少于接口。您不能让实现抛出比接口更广泛的异常
因此,您可以在不使用throws子句的情况下定义方法,如:
public Object GetJSONString(HashMap<String,String> params) {
public对象GetJSONString(HashMap参数){
如果有任何已检查的异常抛出,您可以将其作为未检查的异常重新抛出
如果你想捕捉子类抛出的异常,你必须重新排列你的代码,这样子类的方法被超级类调用,否则超级类就没有机会捕获任何东西。你可以考虑使用策略是否有意义。(这将允许您包装对策略的调用,并可能减少您必须执行的继承量)
经常发生的事情是开发人员使用继承作为他们首选的扩展方式,并且(因为我们总是很匆忙)没有太多关于将关注点分开的想法,其结果是代码复杂且不灵活。按照不同的职责划分这些关注点可能有助于降低复杂性,并可能有助于解决异常抛出的情况,因为不同的关注点会更好地集中在一起,并且不能hr显示范围较小的异常。为什么不创建一个自定义的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 {
}
公共类一般收入扩展BaseReport{
私有最终记录器=Logger.getLogger(GeneralRevenue.class);
公共一般收入(连接)
this.conn=_conn;
}
@凌驾
公共对象GetJSONString(HashMap参数)抛出MyException{
试一试{
//代码
}捕获(例外e){
抛出新的MyException();
}
返回jObj.toString();
}
}
类MyException扩展了RuntimeException{
}
如果抛出RuntimeException,则无需添加抛出声明
class NewException extends RuntimeException{
}
然后,当您向基类添加RuntimeException时,所有其他方法都不必声明调用这些方法的抛出
这段代码是在我之前编写的,所有concreate类的方法都会抛出异常。有没有一种方法可以在不添加try catch all concreate类的方法的情况下处理基类中的所有异常?例如,我可以捕获concreate类中、基类中累积的异常?所有类方法都必须抛出异常,但我我想问一下,我希望我能解释一下我的想法problem@talhakosen:是的,您可以捕获混凝土类中的任何内容并在那里处理。您不需要抛出任何内容。首先感谢您的回答!请看我的问题,如何捕获在GeneralReveneu类的GetJSONSt中发生的异常基类中的ring方法?@talhakosen:想知道这是否是其中的一部分,但不确定。不,基类无法捕获子类的异常。如果您修改了一些内容以使用策略而不是子类,则策略引发的异常可以由策略的调用方处理。(或者,同样地,重新安排事情,使子类完成的事情被超类调用)
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 {
}
class NewException extends RuntimeException{
}