Чтобы понять это, давайте рассмотрим пример, в котором у нас есть класс, 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
Теперь предположим, что readAndGetin Humanвыбрасывает любое другое проверенное исключение, например Exception, и мы знаем, что оно readAndGetбудет Humanвызвано из экземпляра, потому что mammalудерживается new Human().
Поскольку для компилятора метод вызывается из Mammal, поэтому компилятор заставит нас обрабатывать только, IOExceptionно во время выполнения мы знаем, что метод будет генерировать Exceptionисключение, которое не обрабатывается, и наш код сломается, если метод вызовет исключение.
Вот почему это предотвращается на уровне самого компилятора, и нам не разрешается генерировать какое-либо новое или более широкое проверенное исключение, потому что оно не будет обработано JVM в конце.
Есть и другие правила, которым мы должны следовать при переопределении методов, и вы можете прочитать больше о том, почему мы должны следовать правилам переопределения методов, чтобы узнать причины.