1

我正在尝试将 B 类派生到 Java 中的新 C 类。基类构造函数要求必须抛出或捕获未报告的异常。但是如果我尝试将 super(..) 放在 try/catch 中,那么我会被告知对 super 的调用必须是构造函数中的第一条语句。有谁知道解决这个问题的方法?

public class C extends B
{
   //Following attempt at a constructor generates the error "Undeclared exception E; must be caught or declared
   //to be thrown
    public C(String s)
    { 
         super(s);
    }

    //But the below also fails because "Call to super must be the first statement in constructor"
    public C(String s)
    {
         try
         {
              super(s);
         }
          catch( Exception e)
         {
         }
     }
 }

非常感谢,克里斯

4

4 回答 4

1

您始终可以使用throws 子句声明Exceptionin 构造函数签名。

public C(String s) throws WhatEverException
    {
于 2013-02-26T17:14:39.127 回答
1

我知道的唯一方法是在子类构造函数中也抛出异常。

public class B {
    public B(String s) throws E {
       // ... your code .../
    }
}

public class C extends B {
   public C(String s) throws E { 
       super(s);
   }

}

于 2013-02-26T17:16:03.540 回答
0

如果不在第一条语句中调用超级构造函数,就无法定义构造函数。如果有可能你可以抛出运行时异常,那么你不需要编写 try/catch 块。

于 2013-02-26T17:16:58.323 回答
0

那么,您需要了解三件事。

  1. 在子构造函数中 super 必须是第一条语句,
  2. 如果父类方法抛出异常,则子类可以选择捕获它或将异常抛出回父类。
  3. 您不能缩小子类中异常的范围。

例子 -

public class Parent {

public Parent(){
    throw new NullPointerException("I am throwing exception");
}

public void sayHifromParent(){
    System.out.println("Hi");
}
}


public class Child extends Parent{

public Child()throws NullPointerException{

    super();

}
public static void main(String[] args) {
    Child child = new Child();
    System.out.println("Hi");
    child.sayHifromParent();

}

}
于 2013-02-26T17:32:08.820 回答