Po przeczytaniu Why can't overriding methods throw exceptions, to rozumieć, że w przypadku metody zadeklarowane jako generuje sprawdzone wyjątek nadrzędnym Sposób podklasy tylko może zadeklarować wyrzucić ten wyjątek lub podklasy:Wywoływanie nadrzędne sposób, że rzuty sprawdzone wyjątek
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
}
Tak więc, ponieważ mogę zadeklarować metodę nadpisującą jako rzutuje dowolną podklasę z , mogę zadeklarować metodę przesłaniania.
W moim programie chcę wywołać metodę przesłaniania zadeklarowaną jako rzutnie FileNotFoundException
IS-A IOException
. również obsługiwane z bloku 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{}
}
Ale ja dostaję ten błąd kompilacji:
Sub.java:6: error: unreported exception IOException; must be caught or declared to be thrown
p.doStuff();
^
Jaki jest powód? Jestem nieco zdezorientowany, ponieważ wszystko, co klasa Base ma również dostępne dla podklas.
Również znacznie bardziej myląca jest możliwość złapania Exception
i Throwable
Oprócz IOException
(Przeciwieństwo nadrzędnego pojęcia).
Niektóre osoby mogą mieć zablokowane obrazy. Czy możesz również skopiować wkleić błąd kompilacji w swoim pytaniu. – CKing
@CKing dodane teraz – Pauwelyn