为什么应该在继承中处理异常,因为构造函数不是继承的?

时间:2015-09-01 15:18:06

标签: java

我知道构造函数不是继承的。

那么在子构造函数中处理异常的原因是什么。在我们创建孩子的对象或什么的时候,在场景后面有些人正在创建父对象吗?

public class Parent {
    public Parent() throws Exception{

    }
}

class Child extends Parent {
    public Child(){ // compile time error "Unhandled Exception Type"

    }
}

我不是通过在子构造函数中调用Super()来尝试初始化父类。我不明白为什么要这样做。

提前致谢。

3 个答案:

答案 0 :(得分:4)

参考JLS 8.8.7 Constructor Body

  

如果构造函数体不以显式构造函数调用开始...那么构造函数体隐式地以超类构造函数调用super()开始;

换句话说,以下代码在语义上与您的Child类相同。定义:

class Child extends Parent {
    public Child(){ // compile time error "Unhandled Exception Type"
      super();  // This throws Exception.
    }
}

这必须发生,因为必须进行初始化Parent实例所需的初始化。考虑如果没有调用超级构造函数会发生什么:

class Parent {
  private final Frobnitz foo;

  Parent() throws Exception {
    foo = new Frobnitz();
  }

  void doSomething() {
    foo.doYourFrobbing();
  }
}

class Child extends Parent { ... }

class Main {
  public static void main(String[] args) {
    new Child().doSomething();  // Would cause a NPE unless Parent() is called (implicitly or explicitly).
  }
}

答案 1 :(得分:3)

如果创建了child类型的对象,则会显式调用超类的构造函数(显式或隐式)。这就是你需要捕捉异常的原因。

答案 2 :(得分:3)

如果您未在子类的构造函数中显式调用super(),则会隐式调用它,因此您必须捕获异常,或声明您的子类的构造函数抛出异常。