Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何抓住;“抛出异常”;不使用try-catch块?_Java_Design Patterns_Try Catch - Fatal编程技术网

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{

  }