Aby to zrozumieć, rozważmy przykład, w którym mamy klasę, Mammalktóra definiuje readAndGetmetodę, która odczytuje jakiś plik, wykonuje na nim jakąś operację i zwraca instancję klasy Mammal.
class Mammal {
public Mammal readAndGet() throws IOException {//read file and return Mammal`s object}
}
Klasa Humanrozszerza klasę Mammali przesłania readAndGetmetodę, aby zwrócić wystąpienie Humanzamiast wystąpienia Mammal.
class Human extends Mammal {
@Override
public Human readAndGet() throws FileNotFoundException {//read file and return Human object}
}
Aby zadzwonić readAndGet, będziemy musieli obsłużyć, IOExceptionponieważ jest to sprawdzony wyjątek i readAndMethodrzuca go ssak .
Mammal mammal = new Human();
try {
Mammal obj = mammal.readAndGet();
} catch (IOException ex) {..}
Wiemy, że kompilator mammal.readAndGet()jest wywoływany z obiektu klasy, Mammalale w czasie wykonywania JVM rozpozna mammal.readAndGet()wywołanie metody na wywołanie z klasy, Humanponieważ mammaljest wstrzymane new Human().
Metoda readAndMethodz Mammalrzuca IOExceptiona ponieważ jest to sprawdzone kompilator wyjątek zmusi nas złapać go, gdy wzywamy readAndGetnamammal
Teraz przypuśćmy, że readAndGetin Humanrzuca dowolny inny sprawdzony wyjątek, np. Exception i wiemy, że readAndGetzostanie wywołany z instancji, Humanponieważ mammaltrzyma new Human().
Ponieważ dla kompilatora metoda jest wywoływana z Mammal, więc kompilator zmusi nas do obsługi, IOExceptionale w czasie wykonywania wiemy, że metoda będzie rzucać Exceptionwyjątek, który nie jest obsługiwany, a nasz kod się zepsuje, jeśli metoda wyrzuci wyjątek.
Dlatego jest to zabronione na poziomie samego kompilatora i nie możemy zgłosić żadnego nowego lub szerszego sprawdzonego wyjątku, ponieważ na końcu nie będzie on obsługiwany przez JVM.
Istnieją również inne zasady, których musimy przestrzegać, zastępując metody, i możesz przeczytać więcej na temat Dlaczego powinniśmy przestrzegać reguł zastępujących metody, aby poznać przyczyny.