Exceção em Catch de superclasses e subclasses, pq pode dar erro?

4 respostas
J

Ola galera, to numa sinuca de bico aqui, não to sabendo explicar essa questão
aqui. Se alguém puder me dar uma dica, obrigado!

A ordem dos tratadores de exceção (Catch) é importante, pois se vc tentar capturar um tipo de exceção
de superclasse antes de um tipo de subclasse, o compilador deve gerar erros. Por que estes erros
acontecem?

Se alguem puder ajudar, desde já agradeço!

Obrigado!
Abraços
Bom fim de semana galera!

4 Respostas

E

Vamos dar um exemplo. Digamos que você tenha um código assim:

try {
    x = 0 / 0;
} catch (Exception ex) {
    System.out.println ("SH*T HAPPENS");
} catch (RuntimeException ex) {
    System.out.println ("Tio, deu problema. Que que foi?");
} catch (ArithmeticException ex) {
    System.out.println ("dividiu por zero, hein?");
}

Quando você divide 0 por 0, deve ocorrer um ArithmeticException (que é uma subclasse de RuntimeException, que é uma subclasse de Exception).

Se o programa acima fosse válido, você teria uma mensagem “SH*T HAPPENS” (que é o que você não está esperando, na verdade) porque os catches são processados na ordem em que foram escritos (não na ordem que você pensou - compilador não lê pensamentos), e nesse caso, como uma ArithmeticException é uma Exception, então você acabaria tratando antes do desejado.

Como o pessoal que definiu a linguagem pensou um pouquinho, a definição da linguagem diz que isso é ilegal, porque sua intenção é tratar uma ArithmeticException, não uma Exception genérica. Então você é forçado a especificar primeiro as exceções mais detalhadas (ArithmeticException) e por último as mais abrangentes (Exception).

try {
    x = 0 / 0;
} catch (ArithmeticException ex) {
    System.out.println ("dividiu por zero, hein?");
} catch (RuntimeException ex) {
    System.out.println ("Tio, deu problema. Que que foi?");
} catch (Exception ex) {
    System.out.println ("SH*T HAPPENS");
}
J

Exemplo de superclasse:

public abstract class naoErre extends Exception{

    public naoErre() {
    }

    public naoErre(String message) {
        super(message);
    }

 }
Exemplo de subclasse:
public class naoErreValorDeDeposito extends naoErre {
    double saldo;
    public void depositar(double valor) throws naoErre{
        if (valor > 0) {
            this.saldo= this.saldo + valor;

        } else {
            throw new naoErre() {};
        }
    }
}
J

Valeu pela dica entanglement!

Obrigado…
Se alguem quiser dar mais uns pitacos!
Agradeço!

ruben_m

jalmat:
Valeu pela dica entanglement!

Obrigado…
Se alguem quiser dar mais uns pitacos!
Agradeço!

Vlw , não esqueça de editar o Artigo e por RESOLVIDO

Criado 26 de agosto de 2011
Ultima resposta 26 de ago. de 2011
Respostas 4
Participantes 3