Livro da Kathy Sierra SCJP6

Olá pessoal, estou estudando com o livro da kathy Sierra, e me deparei com um exemplo que me parece errado.

[code]
public class Animal {
public void eat() throws Exception{

}

}

public class Dog2 extends Animal {
public void eat(){

}
public static void main(String args[]){
    Animal a = new Dog2();
    Dog2 d = new Dog2();
    d.eat();
}

}[/code]

No livro, a explicação é o seguinte: Este código não compilará devido à exceção declarada no método eat() de Animal. Isso ocorre mesmo que, em tempo de execução, o método eat() usado seja a versão de Dog, a qual não declara a exceção. Mas no meu Java, funcionou e não acusou erro de compilação. Alguém pode me confirmar esse erro?

rafa o codigo nao compila se vc usar á variavel que esta usando o polimorfismo que no caso é:

No caso de cima á variavel “a” devido ao polimorfismo ou tem que assinar no método main o throws ou entao tratar com try-catch.

Tanto no java 6 quanto no 5 compila e executa normalmente. Mesmo usando a variavel a. Interessante.

O código compila e executa… o que não pode ser feito é isso:

[code]
public class Animal {
public void eat() {

}

}

public class Dog2 extends Animal {
public void eat() throws Exception {

}
public static void main(String args[]){
    Dog2 a = new Dog2();
    Dog2 d = new Dog2();
    d.eat();
}

}[/code]

ok?

Valeu galera, agora entendi!

Dessa vez entendi, acho que é o livro da Kathy Sierra que estava errado, o que daria erro em tempo de execução seria este código:

Classe Pai:

public class Animal {
    public void eat() throws Exception{
        System.out.println("Meu animal!");
    }
}

Classe filha:

[code]
public class Horse extends Animal {
public void eat(){
System.out.println(“Meu cavalo!”);
}

public static void main(String args[]){
    Animal a = new Horse();
    a.eat(); //este código não compilará devido à exceção declarada no método eat() de animal.
    Horse d = new Horse();
    d.eat();
}

}
[/code] :thumbup:

Posso estar errado, mas se ele usar á variavel de instancia “a” devido ao polimorfismo so vai compilar se ele usar o bloco try-catch ou assinar com trhows…

A respeito do seu codigo acima se vc estiver falando de “execuçao” como o corpo do seu método nao tem nada haver com ele nao compilar nao…So nao compila pq o método em Animal assinou “throws Exception” entao vc teria que circundar com try-catch.

Para saber essas regrinhas, é só pensar um pouco. Imagine um código escrito assim:

[code]Animal a = new Dog();

try {
a.eat();
} catch(Exception e) {}
[/code]

Se Dog não implementar o throws, esse código dará algum problema? Não. O try catch não pegará nenhuma exception nunca para dog, mas poderá pegar para outros filhos, como Cat ou Mouse.

Agora, imagine que a situação que o renamed colocou.
Onde Animal não lança uma exception, mas dog lança uma exception verificada. Seria possível escrever isso:

Animal a = new Dog(); a.eat();

Mas se a é um dog, existe uma exception verificada! O java não pode exigir um try… catch, pois usuários da classe animal não esperam a exception. Entretanto, quem sobrescreveu dog, disse que ela existe! Percebeu a inconsistência. Lembre-se que você é obrigado a capturar exceptions verificadas!

O problema das exceptions verificadas é exatamente esse. Elas fazem parte da interface pública do método. Você pode reduzir declarações na classe filha, mas não pode incluir mais declarações que o pai tem. Por fazer parte das interface pública, também significa que você não poderá remover uma exception, sem que tenha que recompilar todo código.

Por exemplo, suponha que você decida que o método eat() não deva lançar Exception nenhuma. E então, remove o throws da declaração de Animal. O que acontece? Todo o seu código acusará erro naquele try…catch (no caso de um catch em Exception talvez não, mas se fosse uma CouldNotEatException, certamente daria). O contrário também é válido. Se você adicionar uma exception verificada num método que não tem, o java exigirá a captura ou o rethrow da exception, em todo local que o código for usado.

Por isso, pense com cuidado nas exceptions.

Vini mas do jeito que ele postou o codigo, eu fiz os testes aqui, com a variavel “a” usando polimorfismo o codigo so compila se ele usar try-catch num eh n?

Tente fazer a.eat() e não d.eat() e o erro aparece. Mesmo que a variável a guarde um dog, você continua obrigado a declarar a exception, caso o tipo da referência seja um animal.

Sim.

Se levarmos em consideração tudo que foi postado, então chegamos a conclusão de que o livro está realmente errado. Ja que o primeiro exemplo compila e o livro diz que não compila.