使用Java构造函数抛出异常从类中进行子类化

use*_*412 4 java constructor exception

我的理解是,子类中的重写方法不应该在父类的基本方法上抛出异常或更窄的异常.为什么它在构造函数中起反作用,子类的构造函数必须抛出相同的异常或更广泛,对此有任何合理的解释?

class MyException extends Exception{}
class MySubException extends MyException{}
class MySubSubException extends MySubException{}

public class Alpha {

  public Alpha() throws MyException{

  }
  void foo() throws MyException {}
}

class Beta extends Alpha{

 public Beta() throws MyException{ //NOT MySubSubException
    super();
 }

 void foo() throws MySubException {} //Ok for methods
}
Run Code Online (Sandbox Code Playgroud)

Sot*_*lis 5

为什么它在构造函数中起反作用,子类的构造函数必须抛出相同的异常或更广泛,对此有任何合理的解释?

子类构造函数始终通过调用来调用其父构造函数super(..).在这种情况下,父构造函数被声明为抛出类型的已检查异常MyException.您的子类构造函数必须能够处理它(throws因为super(..)必须是构造函数体中的第一个语句).

使用方法,您不必强制调用super实现.