Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.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 超类处理子类异常_Java_Exception_Inheritance - Fatal编程技术网

Java 超类处理子类异常

Java 超类处理子类异常,java,exception,inheritance,Java,Exception,Inheritance,假设我有一个名为ApplicationDao的超类和一些继承子类,如UserDao、ProductDao等 如果我的catch和finally块对于所有子类的CRUD方法都完全相同,那么超类(ApplicationDao)是否可以处理异常而不是子类。这意味着我只需要在超类中编写一个TRY…CATCH…FINALLY块,而不是在每个子类中复制它 如果可能的话,我不知道该怎么做,因为每个子类中的方法都有不同的名称(UserDao中的getUsers、productDao中的getProducts等等

假设我有一个名为ApplicationDao的超类和一些继承子类,如UserDao、ProductDao等

如果我的catch和finally块对于所有子类的CRUD方法都完全相同,那么超类(ApplicationDao)是否可以处理异常而不是子类。这意味着我只需要在超类中编写一个TRY…CATCH…FINALLY块,而不是在每个子类中复制它

如果可能的话,我不知道该怎么做,因为每个子类中的方法都有不同的名称(UserDao中的getUsers、productDao中的getProducts等等),所以我不会直接重写超类中的方法


任何关于如何在父类中捕获所有子类的异常的建议都值得赞赏。

首先,不要给方法不同的名称。接下来,如果您将
超类
抽象化,并添加一个抽象方法(例如下面的
getObjects()
),那么您可以在一个位置捕获在具体实现中抛出的
异常。此外,还可以为调用方提供一个一致的入口点(例如,
getValues()
注意:这会使调试变得困难

public List<T> getValues() {
  try {
    return getObjects();
  } catch (Exception e) {
    e.printStackTrace();
  } finally {
    System.out.println("In finally");
  }
  return null; // <-- there was an Exception. Default return.
}

protected abstract List<T> getObjects()
    throws Exception;
public List getValues(){
试一试{
返回getObjects();
}捕获(例外e){
e、 printStackTrace();
}最后{
System.out.println(“最终输入”);
}

返回null;//超类无法“处理”子类异常。 子类可以替换/包装超类方法,而不是相反

但是,您可以将代码重构为多个部分:

  • 执行select语句等常见功能可以 移动到类似executeQuery的方法
  • 这可以在基类中使用 使用此基类方法,只需传递适当的sql查询 用那种方法
  • 在这种情况下,executeQuery方法可以处理如下异常 SQLException并将它们包装到特定于应用程序的文件中 异常(如果可以接受,则以静默方式处理异常)

  • 在ApplicationDao中进行公共处理,并让子类调用super类-这样,您只需为公共内容编写一次代码:

    public class ApplicationDao {
    
        public String process() {
            try{
                // Common processing here
            } catch (Exception e) {
                //...
                return "KO";
            }
            return "OK";
        }
    }
    
    public class UserDao extends ApplicationDao  {
    
        public String getUser() {
            String a = super.process();
            // Specific processing here...
            return "user";
        }
    }
    

    我想让应用程序变得抽象…

    你能给我们提供一个代码吗