我们可以在重写方法中抛出新的/更广泛的异常吗?解释下面给出的代码

时间:2012-10-27 10:41:30

标签: java

我是java的初学者,请原谅我,如果我做了任何错误,欢迎提出建议我会很高兴听到我所犯的错误。在此先感谢您阅读和回复我的问题。

我从一些书中得到以下代码

在代码中抛出了新的异常,但代码仍在编译,还有一个代码与我粘贴的代码类似但无法理解不同的行为

第一个代码打印X但是根据我的说法,重写的方法foo()不应该抛出新的异常。其次,在调用方法foo时,如果有try子句,则应使用catch - throws

class X { public void foo() { System.out.print("X "); } }    

public class SubB extends X {

    public void foo() throws RuntimeException {
        super.foo();
        if (true) throw new RuntimeException();
        System.out.print("B ");
    }

    public static void main(String[] args) {
        new SubB().foo();
    }
}

第二个代码与上面的代码类似,但在此我们需要在调用方法时使用try - catch

class A {
    void foo() throws Exception { throw new Exception(); }
}

class SubB2 extends A {
    void foo() { System.out.println("B "); }
}

class Tester {
    public static void main(String[] args) {
        A a = new SubB2();
        a.foo();
    }
}

此异常在父类foo方法中进行了扩展,但在上面的代码中,异常位于子类的foo方法中。

2 个答案:

答案 0 :(得分:1)

overriden methods可以抛出RuntimeExceptions(unchecked exceptions),即使你的superclass method没有抛出一个。但not true的{​​{1}}相同。

在你的情况下:

您的第一个代码编译是因为您在overriden方法中抛出checked exceptions(like IOExceptions....)

以下代码无法编译;

RunTimeException

你得到了编译器错误:public class subClass extends SuperClass { public void overridenMethodFromSuper() throws IOException { } }

答案 1 :(得分:1)

在第一个代码中,您声明要抛出一个RuntimeException,它是一个Unchecked Exception,不需要处理。因此,您也可以将它添加到overriden方法的throws子句中,即使它不在父类方法中。

但是,在第二个代码中,您已声明抛出Exception,它位于异常层次结构中的top level,并且编译器为Checked,您需要声明如果你抛出它,那么父类方法会抛出子句。此外,您还需要在调用方法时处理它。

虽然你不能在基类的overriden方法中增加限制,但在某种意义上,你不能在overriden方法中添加额外的Checked Exception,但是,如果你添加一个UncheckedException,它是允许的。

您可以浏览以下链接,了解有关Exception Handling的更多信息: -