Sobrecarga Dúvida

3 respostas
anderline
Pessoal estou estudando para o SCJP pelo livro da Kath,  q pintou uma dúvida em relação aos lançamentos de exceção em métodos subscritos q diz q um método não pode lançar exceções verificadas novas ou menos abrangentes, bom pelo oq eu entendi um metódo não pode declarar uma ArrayIndexofBound exceptions se ele estiver subescrevendo um métódo que lança uma Exception (por favor me corrijam se eu estiver enganado),  q  eu peguei este exemplo :

class Animal {

public void eat() throws Exception {

}

}

class Dog extends Animal {

public void eat(){// sem exceção}
public static void main(String[]a){

Animal a = new Dog();

Dog d = new Dog();

d.eat(); / / ok

[color=red]a.eat() // erro exceção não declarada[/color]

// resto do código aqui

Esta parte em vermelho que eu não consigo entender, minha dúvida é como o método chamado será escolhido no momento da execução, baseado no obj (neste caso dog), e esse método não declara nenhuma exceção, pq q o código não compila ?

Abraços._

3 Respostas

anderline

Só uma coisinha, agora e eu vi q eu coloquei o titulo errado hehe, é subscrita .Foi mau

L

Eu acho que é mais ou menos assim:

Na linha:

Dog d = new Dog();

o compilador tem certeza que o método declarado na classe animal com Exception não será executado, então ele deixa rolar. Isso pq o objeto de referência é do tipo Dog.

Já na linha:

Animal a = new Dog();

o método que sobe uma Expcetion pode ser chamado, então ele te força trata-lá. Isso pq o objeto de referência é do tipo Animal, e não tem como ele saber que na verdade dentro dele você está colocando uma instância de Dog.

É isso cara?

Abraços…

ViniGodoy

Na verdade funciona assim:

Numa sobrecarga você é obrigado a colocar throws em exceções checked que sejam iguais ou filhas das exceções que serão lançadas pelo pai. No caso, se o método da classe pai lança Exception, o filho pode sim lançar apenas uma SQLException() - filha de Exception e também checked.

A classe filha também pode lançar menos exceções que o pai.

O contrário não é verdadeiro. O filho não pode lançar uma exceção mais genérica que a do pai. Nem mais exceções checked do que o pai lança. Pense na seguinte situação: Se eu atribuir um objeto filho ao pai, e usar os catchs das exceções que o pai lança, eu conseguirei pegar todas as exceções que o filho lança? Se a resposta for sim, é válido. Se for não, é inválido.

No exemplo que você deu, porque o método não compila?
A resposta é simples: Porque você disse que um Animal pode vir a lançar uma exceção.

Veja que o try…catch com a classe animal cobre o caso do Cachorro. Afinal, ele não lança exceção e o código nunca vai executar o catch(). Há problemas nisso? Não, o catch não executa, mas também não causa erros no programa e, caso você resolva lançar uma exceção um dia, o código estará coberto.

Agora, suponha que o contrário seja válido. Suponha que possamos chamar o método eat() do Animal sem um try…catch. E daí, amanhã ou depois, resolvemos trocar da classe Cachorro para classe Burro, que pode sim lançar uma SemCenourasParaComerException(). O que aconteria com o código sem try…catch? Ele estaria inválido, pois não estaria pronto para capturar a exceção verificada do Burro. E olhe a ironia, estava avisado desde o início que um Animal poderia vir a lançar uma exceção.

Criado 19 de janeiro de 2007
Ultima resposta 20 de jan. de 2007
Respostas 3
Participantes 3