Subscrita de metodos - Livro Kathy

ola pessoal…

no livro da kathy em portugues, pag 61, tem a seguinte observação…

Se um método for subscrito mas você usar uma referência polimorfica (do supertipo) para apontar para o objeto do subtipo com o método subscritor, o compilador assumirá que você esta chamando a versão do método do supertipo. Se a versão do supertipo declarar uma exceção verificada, mas o método não o fizer, o compilador ainda assim pensara que você esta chamando um método que declara uma exceção.

e segue o seguinte exemplo:

[code]
public class Animal {
public void eat() throws Exception
{
//lança uma exceção (no livro nao lança nenhuma exceção… entao lancei a seguinte…)
try
{
System.out.println(“eat animal”);
int b = 1;
b = b/0;
}catch(Exception exception)
{
System.out.println("Este erro eu que lancei! "+ exception);
}
}
}

public class Dog2 extends Animal{

    public void eat()
{
	System.out.println("Sem exceções!");
}

public static void main(String[] args) 
{
	Animal a = new Dog2();
	Dog2 b = new Dog2();
	
	b.eat(); // ok
	a.eat(); // erro de compilação (segundo o livro)
}

}[/code]

se eu adicionar a clausula throws Exception no metodo main da classe Dog2, não ocorrera o erro de compilação nem mesmo de execução citado no livro…
a saida sera…

Sem exceções!
Sem exceções!

pelo que entendi na explicação do livro…

se eu NAO declarar uma exceção no metodo eat da classe Dog2 ocorrera um erro caso eu tente instanciar um objeto do tipo Animal usando uma referencia ao objeto Dog2…
e isso nao ocorre se eu adicionar a clausula throws Exception no metodo main…

alias… outra teste que fiz…
mesmo eu declarando um objeto do tipo Animal referenciando ao objeto da super classe Animal… se eu nao declarar a clausula throws Exception no metodo main… ocorrera erro de compilação…

nao entendi nada da explicação do livro… achei q faltou coisa ai… se alguem puder me ajudar…

[]s a todos…

Veja bem eu não acho que vai haver erro de compilação quando vc instanciar uma classe do tipo Animal apontando para a classe Animal. E nem apontando para a classe Dog.

Esse erro de divisão por zero só poderá ocorrer em tempo de execução e as exceçoes do tipo RunTimeException não são do tipo checked ou seja não precisam ser declaradas…

Se eu errei por favor me corrijam…[’]s

Eu achava que também não daria erro de compilação, já que como é um método substituído, a variável “a” irá chamar o método do objeto Dog2 através do polimorfismo.

Mas testei no Eclipse e vi que realmente dá erro de compilação, já que o polimorfismo funciona em tempo de execução.

Pra compilar, ele verifica o método do tipo Animal, que pode lançar uma exceção.

Ah sim desculpe…esqueci de me referenciar à exceção da classe animal

Se for chamado o método da classe cujo método contenha uma exceção do tipo checked…vc precisa capturar ela com try/catch…

por isso Animal a = new Dog(); é uma referência a DOG porém é do tipo Animal e irá chamar métodos do Animal…que no caso possui uma exceção…

correto…

Seguinte

A regra é simples! Declare a exceção ou trate-a. Quando você declara throws no main você esta DECLARANDO a exceção.
Agora vou tentar explicar porque não compila.

Quando você declara na super classe um método que lança uma exceção é bom declarar essa exceção ou uma mais específica (subtipo da exceção do método original). Quando você fizer uma chamada polimórfica a um método, é esperado que aquele método lance uma exceção como foi especificado na superclasse. Lembre-se que o método que vai ser executado é decidido em tempo de execução e não de compilação. As regras de overriding dizem que você pode lançar exceçoes que não são verificadas, lançar exceções mais especificas ou até novas e até mesmo não lançá-las. Mas NÃO pode lançar exceções mais genéricas (super classes da exceção declarada na super classe da sua classe).

Você não precisa declarar a exceção no método da classe Dog2, porem ainda assim precisa tratar a exceção no Main já que Animal define que lança uma Exception.

Espero ter ajudado.

[]s
Gunnar

ajudou sim…

sempre que declarar um exception na minha super classe, ao utilizar o metodo com a exception na subclasse tenho que declara-la no metodo main ow em qq metodo q venha a utiliza-la…

valewwwss… soh acho q o livro poderia ter citado isso nesta abordagem…

[quote=Humbertim2]ajudou sim…

sempre que declarar um exception na minha super classe, ao utilizar o metodo com a exception na subclasse tenho que declara-la no metodo main ow em qq metodo q venha a utiliza-la…

valewwwss… soh acho q o livro poderia ter citado isso nesta abordagem…[/quote]

hehe não é bem assim…
A regra é trate OU declare. Você não tem que fazer um preferencialmente a outro. Normalmente se trata a exceção com blocos try/catch. Quando você declara a exceção você esta passando o problema pra frente, pra quem chamou o seu método que agora também declara uma exceção que deveria ter sido tratada. Como no seu exemplo esse método é o MAIN, não tem nenhum outro método para tratar a exceção e o programa aborta. A melhor maneira seria tratar a exceção com try/catch no main. O código que cuida da exceção vai dentro do bloco catch.

[]s
Gunnar

:slight_smile:

okay… okay…

valewwwss…