如何处理java中超类构造函数抛出的异常?

时间:2014-05-29 11:38:09

标签: java inheritance

我收到的错误是"未处理的异常类型Exception"。所以我有一个问题,我们如何在子类中处理这个抛出的异常。

class A 
{

  A() throws Exception 
  {
       System.out.println ("Executing class A constructor");
       throw new IOException();
  }
}

public class B extends A 
{
  B() //error
  {
       System.out.println ("Executing class B constructor");

  }

  public static void main ( String args[] )
  {
          try 
          {
          A a = new B();
          } 
          catch ( Exception e)
          {
                      System.out.println( e.getMessage() );
          }
  }
}

3 个答案:

答案 0 :(得分:3)

子类的构造函数无法处理由其超类构造函数抛出的异常。

你唯一能做的就是将子类构造函数声明为抛出与超类构造函数声明相同(已检查)的异常; e.g。

    B() throws Exception {
         System.out.println ("Executing class B constructor");
    }

这意味着如果"Executing class B constructor"抛出异常,无法获取要打印的A()消息。

如果你考虑一下,这是件好事。如果您能够从子类构造函数中的super(...)捕获异常,则必须处理可能尚未完全初始化的对象。这可能会有问题。

或者,如果您确实想要处理超类构造函数中出现的异常,则隐藏子类构造函数(即使其成为private),而是使用工厂方法来创建子类实例。该方法可以处理从超类或子类构造函数发出的异常。但请注意,除非构造函数执行 vile (例如通过异常走私this),否则您仍然看不到对部分初始化/损坏对象的引用。


我想这只是一个例子,但值得指出的是,将方法声明为抛出Exception(或Throwable)是一个坏主意。您应该将该方法声明为抛出抛出的实际异常。

答案 1 :(得分:2)

您还需要在子类中抛出异常。

 B() throws Exception
 {
   System.out.println ("Executing class B constructor");
 }

答案 2 :(得分:1)

将throws子句添加到B. B()抛出异常。 构造函数B将期望处理异常,因为它是A的子代。 因为它是一个构造函数,你不能把它放在try catch中。所以选择是抛出它。