После чтения Почему нельзя переопределять методы для исключения исключений, я понимаю, что если метод объявлен как выбравший исключение 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
}
Так что, поскольку SocketException
IS-A IOException
, я могу объявить переопределяющий метод как любой из подклассов IOException
.
В моей программе я хочу вызвать метод переопределения, объявленный как throws FileNotFoundException
IS-A IOException
. также обрабатывается блоком try-catch
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
(противоположность концепции Overriding).