Java 呼叫超级需要尝试/捕获

Java 呼叫超级需要尝试/捕获,java,inheritance,exception-handling,Java,Inheritance,Exception Handling,我正在做一个作业,我被告知我需要创建一个类(称为ClassB),该类必须扩展给定的类(称为ClassA)。唯一的问题是ClassA构造函数内部的代码可能会引发异常,因此当我为ClassB创建构造函数时,我试图在调用super()时包装一个try/catch块,但当然,这不起作用,因为super必须是第一个调用 如何解决此问题?您可以在子类构造函数的throws子句中添加异常:- public ClassB extends ClassA { public ClassB() throws M

我正在做一个作业,我被告知我需要创建一个类(称为ClassB),该类必须扩展给定的类(称为ClassA)。唯一的问题是ClassA构造函数内部的代码可能会引发异常,因此当我为ClassB创建构造函数时,我试图在调用super()时包装一个try/catch块,但当然,这不起作用,因为super必须是第一个调用


如何解决此问题?

您可以在子类构造函数的throws子句中添加异常:-

public ClassB extends ClassA {
    public ClassB() throws MyClassAException {
        super();
    }
}
class ClassA {
    ClassA() throws Exception {

    }
}
public class Demo extends ClassA {
    Demo() throws Exception {
        super();
    }

    public static void main(String[] args) {
        try {
            Demo d = new Demo();   // Handle exception here.
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ClassB
应该有一个静态方法

public static ClassB makeClassB() {
    try {
        return new ClassB();
    }
    catch(Exception exc) {
        // whatever logic you are currently performing to swallow
        // presumably you have some default ClassB to return as part of this logic?
    }

这将用try/catch来包装
ClassB
的构造。客户端代码将调用
makeClassB()
,而
ClassB
的构造函数将是
private
和throwing。

向子类构造函数添加throws子句。@RohitJain它确实有效。但是为什么呢?它只适用于构造函数,或者通常适用于每个方法?当然正确,但不要将类命名为大写的关键字版本(即使它是合法的)