为什么默认构造函数无法处理异常类型Exception?

时间:2014-05-19 10:42:58

标签: java exception inheritance constructor

我想知道为什么我必须定义一个explict构造函数,因为我收到的错误表明默认构造函数无法处理由隐式超级构造函数抛出的异常类型Exception。

class A {
    A() throws Exception {
        System.out.println("A Class");
    }
}

public class Example extends A {
    public static void main(String args[]) throws Exception {
        Example t = new Example();
    }
}

2 个答案:

答案 0 :(得分:2)

是的 - 您的Example课程有效声明:

public Example() {
    super();
}

这将无法编译,因为super()调用正在调用A()构造函数,该构造函数被声明为抛出Exception,这是一个已检查的异常。这在构造函数中同样是一个错误,因为它调用一个方法来声明它从一个方法中抛出一个已检查的异常,该方法既没有捕获异常也没有声明它自己抛出它。

因此,您需要在Example中的显式声明的构造函数中声明异常。

public Example() throws Exception {
    super(); // This is implicit; you can remove it if you want.
}

代替。请注意,这仅在构造函数抛出已检查异常时才相关...不需要声明未经检查的异常,因此“编译器提供的”默认异常就可以了。

另请注意,您不能捕获超级构造函数抛出的异常。

答案 1 :(得分:0)

您必须向Example类添加带throws子句的显式构造函数。

public Example() throws Exception {
}