当超类默认构造函数具有'throws'子句时,为什么我会得到未报告的异常?

时间:2013-04-04 13:21:40

标签: java exception

当我运行以下代码

时,我收到了未报告的异常

我的代码如下所示

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

public class Sub extends Super {    
  public static void main(String[] args) throws Exception {    
    Sub s = new Sub();    
  }    
}

发生以下错误:     Sub.java:6:默认构造函数中未报告的异常java.lang.Exception
    公共类Sub延伸超级{
    1错误

4 个答案:

答案 0 :(得分:11)

您尚未为Sub定义默认构造函数,Super正在报告已检查的异常。要修复它,请将此构造函数添加到Sub:

public Sub() throws Exception {
    super();
}

答案 1 :(得分:2)

Eclipse报告以下代码并拒绝编译代码。

  

默认构造函数无法处理由隐式超级构造函数抛出的异常类型Exception。必须定义显式构造函数

因此,您必须明确定义一个构造函数。

答案 2 :(得分:2)

默认情况下,所有类的默认构造函数都调用超类默认构造函数。现在,当您的超类构造函数抛出异常时,当子类构造函数调用超类构造函数时,它需要处理异常或抛出异常。
现在你的类中没有提到任何构造函数,所以编译器会创建一个默认的构造函数并调用super(),因为super()抛出异常并且你的构造函数没有抛出/处理任何异常,它将无法编译

答案 3 :(得分:2)

我同意Jalynn2。另一个解决方案是对RuntimeException进行Exception,因为你没有在这个构造函数中特别提出任何东西。

class Super {
  public Super() throws RuntimeException {    
    System.out.println("Super Class");    
  }
}