Prośba o wyjaśnienie błędów

0

Sory, edytowałem po zapomniałem ponumerować opisy. Teraz jest czytelniej.
Cytat z pewnego kursu:
"

  1. 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,

  2. 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,

  3. 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,

  4. 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?

0

Dobra, sory za durny temat. Już chyba się połapałem o co come on.

1
  1. Bo NumberFormatException jest RuntimeException
  2. Bo raz masz nadklase a raz podklasę.

Generalnie zalecam zapoznać sie tutaj z pojeciem kowariancji oraz kontrawariancji typów, bo analogiczne problemy pojawiaja się także w trakcie zmiany typów argumentów / typów zwracanych w metodach podklas. Więc może warto od razu zapoznać sie z szerszym pojeciem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1