После прочтения Why can't overriding methods throw exceptions, Я понимаю, что если метод объявлен как бросает проверяемое исключение, наиважнейший метод в подклассе может объявить только выбросить это исключение или его подкласс:Вызова метода переопределения, что броски Проверены исключение
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
.
В моей программе я хочу вызвать метод переопределения, объявленный как броски FileNotFoundException
IS-A 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();
^
Какова причина этого? Я немного смущен, потому что все, что класс Base также доступен для подклассов.
Также гораздо более запутанной является способность ловить Exception
и Throwable
В дополнение к IOException
(Противоположность концепции Переопределения).
У некоторых людей могут быть заблокированы изображения. Можете ли вы также скопировать вставьте ошибку компиляции в свой вопрос. – CKing
@CKing добавлен прямо сейчас – Pauwelyn