Regra sobre Subscrição

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 tô entendendo por que aqui dá erro de compilação....

}

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

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

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

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.