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

q0qdq0h2  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(338)
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());
        } 
}

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

cwxwcias

cwxwcias1#

对于选中的异常(不是任何 RuntimeException ),它们必须由调用引发异常的另一个方法的方法处理或引发。oracle关于异常的教程中也对此进行了更深入的解释。
此示例基于您的代码:

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);
  }
}

请注意,您的代码永远不会真正抛出异常,因为被0除将首先抛出。 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 的方法调用“不会让我通过”是因为 Exceptionmethod1 你在电话里说的 Second 的方法调用。所以你要么把电话转到 method1() 在试抓块中,或 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

相关问题