Когда ты переопределяешь метод в дочернем классе, ты не можешь выбрасывать дополнительные проверяемые исключения, которые не объявлены в методе родительского класса. Однако ты можешь выбрасывать непроверяемые исключения (RuntimeException и его подклассы) без ограничений.
RuntimeException; объявления не требуютСогласно контракту переопределения методов в Java, метод дочернего класса не может выбрасывать более широкие или дополнительные проверяемые исключения, чем метод родительского класса. Это гарантирует, что код, вызывающий метод родительского класса, не столкнётся с неожиданными проверяемыми исключениями при использовании экземпляра дочернего класса.
Непроверяемые исключения выбрасывать можно, потому что они сигнализируют об ошибках в коде и не являются частью объявленного контракта метода.
class Parent {
public void doSomething() throws IOException {
// реализация
}
}
class Child extends Parent {
@Override
public void doSomething() throws IOException, NullPointerException {
// IOException: разрешено (как у родителя)
// NullPointerException: разрешено (непроверяемое)
// FileNotFoundException: НЕ разрешено (проверяемое, не объявлено у родителя)
}
}
Это ограничение — фундаментальный принцип полиморфизма и типобезопасности в Java. Когда объект дочернего класса используется как тип родительского класса, вызывающий код ожидает только те исключения, которые объявлены в методе родителя.
Дочерний класс может бросить FileNotFoundException в переопределённом методе, если метод родительского класса объявляет только IOException, так как FileNotFoundException — это подкласс IOException.
Новый — ещё не проверен сообществом
Вы