После чтения Почему нельзя переопределять методы для исключения исключений, я понимаю, что если метод объявлен как выбравший исключение 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).