Мой Parent
класс:
import java.io.IOException;
public class Parent {
int x = 0;
public int getX() throws IOException{
if(x<=0){
throw new IOException();
}
return x;
}
}
I extend
этот класс для записи подкласса Child
:
public class Child1 extends Parent{
public int getX(){
return x+10;
}
}
Обратите внимание, что при переопределении метода getX в классе Child
я удалил предложение throws
из определения метода. Теперь это приводит к аномальному поведению ожидаемый компилятор:
new Parent().getX() ;
не компилируется, не заключая его в блок try-catch
, как ожидалось.
new Child().getX() ;
компилируется, не заключая его в try-catch
блок.
Но приведенные ниже строки кода требуют блока try-catch.
Parent p = new Child();
p.getX();
Так как это можно предвидеть, например, используя ссылку на родительский класс для вызова дочернего метода во время полиморфизма во время выполнения, почему разработчики Java не сделали обязательным включение предложения throws в определение метода при переопределении определенного родителя метод класса? Я имею в виду, если у метода родительского класса есть предложение throws в своем определении, то при переопределении метод overriding должен также включать предложение throws, не так ли?