Porém, eu não entendi qual o problema. O erro diz que "o método sobreescrito NÃO joga uma IOException". Mas ele faz exatamente isso! Quem não joga uma IOException é o método da classe pai (A neste caso)
se um método na superclasse não lançar exceções verificadas o msm método não pode lançar exceções verificadas na subclasse
T
TiagoTC
Essas regrinhas são fogo… vmsb11, a explicação para isso é por causa do polimorfismo também?
V
vmsb11
creio que sim TiagoTC, uma das regras para declarar exceções tem alguma relação com o polimorfismo
por exemplo se um método da superclasse lançar uma exceção verificada do tipo X, o método da subclasse só poderá lançar uma exceção do tipo X ou Y(desde que Y seja um subtipo de X),
por exemplo
só ressaltando exceções verificadas são aquelas que herdam da classe Exception e exceções não verificadas são aquelas que herdam das classes Error e RuntimeException
editando
corrigi um pequeno erro do código acima.
E
evertonsilvagomesjav
Sim mas na classe cachorro ele poderia lançar um MyException tb, assim como MySubException.
V
vmsb11
sim, eu no código comentado tb ta dizendo isso.
E
evertonsilvagomesjav
vmsb no caso do NullPointerException funcionaria pq?
V
vmsb11
ela extende RuntimeException que extende Exception e pela regra as classes que extendem a classe RuntimeException são exceções não verificadas ai eu acho que o compilador internamente consegue separar oque é exceções verificadas e não verificadas.
E
evertonsilvagomesjav
hum ok, entao nao tem nada haver com hierarquia mesmo n…
E
evertonsilvagomesjav
entao se a superclass assina um método com exceçao verificada, a subclass pode assinar com qualquer nao verificada?
T
TiagoTC
Exatamente! Para provar, olhe esta frase:
“The overriding method CAN throw any unchecked (runtime) exception, regardless of whether the overridden method declares the exception.”
Vejas as classes que extedem RuntimeException: ArithmeticException, NullPointerException, ArrayStoreException, IndexOutOfBoundsExceptions.
Imagina usar trycatch pra acessar um objeto que poderia lançar uma NullPointerException, trycatch pra um cálculo simples, trycatch pra acessar e escrever num Array e por aí vai…