Regra sobre Subscrição

4 respostas
Raff

Pessoal eu não to entendendo muito bem quanto as regras de subscrição são válidas quando o método da superclasse lança um exceção…

public class Animal(){

 void eat() {

}

}

public class Dog extends Animal{

public void eat() throws Exception {

}// eu não  entendendo por que aqui  erro de compilação....

}

4 Respostas

andreiribas

se essas duas classes estiverem declaradas no mesmo arquivo, então é porque você não pode declarar as duas em um mesmo arquivo

GiancarloBraga

Você pode declarar num mesmo arquivo sim, mas desde que apenas uma seja public(se não me engano).

Raff

Pessoal a minha duvida não foi essa … a minha duvida é sobre a regras da subscrição quando usa exeção

ViniGodoy

A subclasse deve lançar as mesmas exceções checked da classe mãe.
Ela pode também lançar menos exceções.

Mas não pode lançar mais exceções. Isso porque um código como esse deve sempre permanecer válido:

Animal animal = loadAnimal(); animal.eat();

Note que na segunda linha, não capturei exceção. Isso pq a sua classe Animal não lançava nenhuma exceção verificada.
O que aconteceria com esse código se dissessemos que Dog pode lançar uma exceção verificada?

Veja que é incompatível. Animal não lança exceção, portanto o código acima é valido. Mas Dog lançaria? Dog é um animal!

Agora, um código assim estaria válido:

try { Dog d = getDog(); d.eat(); } catch (Exception e) { //loga a exceção e mostra um erro }

Mesmo que o método getDog() retornasse um Terrier, que não lançasse exceção nenhuma. Mesmo que ele faça um try… catch na exceção, não seria obrigatório que o catch seja usado.

Criado 24 de outubro de 2007
Ultima resposta 24 de out. de 2007
Respostas 4
Participantes 4