Для розуміння цього розглянемо приклад, коли у нас є клас, Mammalякий визначає readAndGetметод, який читає якийсь файл, виконує деяку операцію над ним і повертає екземпляр класу Mammal.
class Mammal {
public Mammal readAndGet() throws IOException {//read file and return Mammal`s object}
}
Клас Humanрозширює метод класу Mammalта замінює, readAndGetщоб повернути екземпляр Humanзамість екземпляра Mammal.
class Human extends Mammal {
@Override
public Human readAndGet() throws FileNotFoundException {//read file and return Human object}
}
Щоб зателефонувати, readAndGetнам потрібно буде впоратися, IOExceptionтому що це перевірене виняток, і ссавці readAndMethodкидають його.
Mammal mammal = new Human();
try {
Mammal obj = mammal.readAndGet();
} catch (IOException ex) {..}
І ми знаємо, що для компілятора mammal.readAndGet()викликається виклик з об'єкта класу, Mammalале в, час виконання JVM вирішить mammal.readAndGet()виклик методу на виклик з класу, Humanтому що mammalвін утримує new Human().
Метод readAndMethodвід Mammalкидає , IOExceptionі тому , що це перевіряється компілятор виключення змусить нас зловити його всякий раз , коли ми викликаємо readAndGetнаmammal
Тепер припустимо , що readAndGetв Humanкидає будь-який інший перевірив виняток , наприклад , виключення , і ми знаємо , readAndGetбуде викликаний з примірника , Humanтому що mammalтримає new Human().
Тому що для компілятора метод викликається Mammal, тому компілятор змусить нас обробляти тільки, IOExceptionале під час виконання ми знаємо, що метод буде викидати Exceptionвиняток, який не отримується, і наш код порушиться, якщо метод викине виняток.
Ось чому це заважає на самому рівні компілятора, і нам не дозволяється викидати будь-який новий або ширший перевірений виняток, оскільки він не буде оброблятися JVM в кінці.
Також існують інші правила, яких нам потрібно дотримуватися, переосмислюючи методи, і ви можете прочитати докладнішу інформацію про те, чому нам слід дотримуватися правил переосмислення методу, щоб знати причини.