Sory, edytowałem po zapomniałem ponumerować opisy. Teraz jest czytelniej.
Cytat z pewnego kursu:
"
-
jeżeli metoda z klasy bazowej nie ma klauzuli throws, to metoda przedefiniowująca ją w klasie pochodnej nie może wymienić w swojej klauzuli throws żadnych wyjątków kontrolowanych,
-
jeżeli metoda z klasy bazowej wymienia w swojej klauzuli throws jakieś wyjatki kontrolowane, to metoda przedefiniowująca ją w klasie pochodnej nie może wymienić żadnej nadklasy tych wyjątków ani żadnych dodatkowych innych klas wyjątków kontrolowanych, może natomiast wymienić dowolne wyjątki pochodzące z podklas wyjątków, zgłaszanych przez metodę z klasy bazowej,
-
niezależnie od metody z klasy bazowej metoda przedefiniowana w klasie pochodnej może nie zgłaszać żadnych wyjatków i nie mieć klauzuli throws,
-
metoda przedefiniowana w klasie pochodnej zawsze może zgłaszać wyjatki niekontrolowane i ew. wymieniać je w swojej klauzuli throws (co nie jest obowiązkowe).
Ilustruje to przykładowy kod, w którym:
wyjątek IOException jest pochodny od Exception,
wyjątek FileNotFoundException jest pochodny od IOException,
wyjątek NumberFormatException jest pochodny od RuntimeException."
class A {
void met1() {}
void met2() throws FileNotFoundException {}
void met3() throws IOException {}
void met4() throws Exception {}
void met5() {}
}
class B extends A {
void met1() throws Exception {} // błąd: ilustruje pkt. 1
void met2() throws IOExcepetion {} // błąd: ilustruje pkt. 2
void met3() throws FileNotFoundException, IOException {} // ok, ilustruje pkt 2
void met4() {} // ok, ilustruje pkt 3
void met5() throws NumberFormatException { } // ok, ilustruje pkt 4
}
Kod skopiowałem z pewnego kursu w necie. Tam nie mam kogo spytać, a sam nie do końca rozumiem.
1.Dlaczego met5 w klasie B jest okej, a met1 w tej samej klasie już nie jest okej.
2.Dlaczego met2 w kl.B jest źle, a już met3 jest dobrze?