我是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
方法中。
答案 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
的更多信息: -