如何将错误捕获留给子类?

How to leave the error catching to the subclass?

public class First {
protected void method1() throws CustomException {
    int number=10/0;
    System.out.println("method 1" + number);
    throw new CustomException("Divided by zero");
}
public class Second extends First {
protected void method2() {
        method1();
    
}
public class Third extends Second {
protected void method3(){
    try {
        method2();
        }
        catch (CustomException ex)
        {
            System.out.println("Caught the exception");
            System.out.println(ex.getMessage());
        } 
}

在这段代码中,第一个抛出异常,我想从第三个中捕获它(第二个不会处理错误)。但是第二个方法调用不会让我通过。我该如何解决这个问题?

对于已检查的异常(不是任何RuntimeException),它们必须由调用另一个抛出异常的方法的方法处理或抛出。 Oracle 在 Exceptions.

上的教程中也对此进行了更深入的解释

此示例基于您的代码:

class Testing{
  public static void main(String[] args) {
    Third t = new Third();
    t.method3();
  }
}

它会打印:

Caught the exception
Divided by zero

添加了 CustomException 缺少的实现:

class CustomException extends Exception{
  CustomException(){
    super();
  }
  CustomException(String message){
    super(message);
  }
}

请注意,您的代码永远不会真正抛出异常,因为除以零会首先抛出异常。 ArithmeticException 是一个 RuntimeException,因此不是检查异常,它不需要或保证任何声明。我已将其删除,因此抛出了您的异常:

class First {
  protected void method1() throws CustomException {
  // will cause "java.lang.ArithmeticException: / by zero" not CustomException
  //  int number=10/0;
  //  System.out.println("method 1" + number);
    throw new CustomException("Divided by zero");
  }
} // missing end brace

你的 Second 方法调用“不让我通过”的原因是你在 method1 中抛出一个 Exception Second的方法调用。因此,您需要将对 method1() 的调用包装在 try-catch 块中,或者 throws 。因为你“想从第三个抓住它”,你需要在方法的声明中 throws 它:

class Second extends First {
  // error: unreported exception CustomException; must be caught or declared to be thrown
  // protected void method2() {  // your version

  protected void method2() throws CustomException {
    method1();
  }
} // missing end brace

这没有变化,除了添加了大括号:

class Third extends Second {
  protected void method3(){
    try {
      method2();
    } catch (CustomException ex) {
      System.out.println("Caught the exception");
      System.out.println(ex.getMessage());
    } 
  } 
} // missing end brace