调用引发已检验异常的重写方法
2022-09-04 05:53:09
在阅读了为什么不能重写方法抛出异常之后,我了解到,如果声明为Rest checked异常的方法,则子类中的重写方法只能声明抛出该异常或其子类:
class A {
public void foo() throws IOException {..}
}
class B extends A {
@Override
public void foo() throws SocketException {..} // allowed
@Override
public void foo() throws SQLException {..} // NOT allowed
}
因此,因为 IS-A,我可以声明重写方法为抛出 的任何子类。SocketException
IOException
IOException
在我的程序中,我想调用声明为 throw is-A 的重写方法。也使用试捕捉块进行处理FileNotFoundException
IOException
import java.io.*;
class Sub extends Super{
public static void main (String [] args){
Super p = new Sub();
try {
p.doStuff();
}catch(FileNotFoundException e){
}
}
public void doStuff() throws FileNotFoundException{}
}
class Super{
public void doStuff() throws IOException{}
}
Sub.java:6: error: unreported exception IOException; must be caught or declared to be thrown
p.doStuff();
^
这是什么原因呢?我有点困惑,因为基类的所有内容也可供子类使用。
同样更令人困惑的是捕获和除了的能力(与覆盖概念相反)。Exception
Throwable
IOException