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