0

我是java初学者,如果我确实犯了任何错误,请原谅我,欢迎提出建议,我很乐意听取我所犯的错误。提前感谢您阅读并回答我的问题。

我从某本书中得到以下代码

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

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

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方法中。

4

2 回答 2

1

overriden methodsRuntimeExceptions(unchecked exceptions)即使你superclass method不扔也可以扔。但同样not true适用checked exceptions(like IOExceptions....)

在你的情况下:

您的第一个代码会编译,因为您RunTimeException在覆盖的方法中抛出了 a 。

以下代码无法编译;

public class subClass extends SuperClass {
     public void overridenMethodFromSuper() throws IOException {


     }

 } 

你会得到一个编译器错误:Exception IOException is not compatible with throws clause in SuperClass.overridenMethodFromSuper()

于 2012-10-27T10:44:18.543 回答
1

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

但是,在第二个代码中,您已声明 throwException位于top level异常层次结构中,并且Checked由编译器进行,如果您要抛出它,则需要在父类方法 throws 子句中声明。此外,您还需要在调用该方法时处理它。

虽然不能在基类中增加覆盖方法的限制,但从某种意义上说,不能Checked Exception在覆盖方法中添加额外的限制,但是,如果添加 UncheckedException,则允许。

您可以通过以下链接了解更多信息Exception Handling:-

于 2012-10-27T10:45:00.070 回答