1
resposta

Não deveria cair no tratamento do catch?

Olá.

Utilizando os exemplos dados no curso, fiquei com uma dúvida. Na classe Conta, no método Deposita, sendo ele manipulado com throws da exceção criada MinhaExcecao, quaisquer erros que ocorressem no método Deposita, posteriormente onde ele é chamado, no try catch (pois é checked), não deveria entrar no catch? No exemplo dado, ele não entra, coloquei uma operação aritmética incorreta para testar isso, mas entra quando mudo o meu catch para receber Exception por exemplo....

Códigos abaixo:

public class Conta { public double deposita() throws MinhaExcecao{

    double a=9/0;
    return a;
}

}

A exceção:

public class MinhaExcecao extends Exception{

public MinhaExcecao(String msg) {
    super(msg);
}

}

Chamando o método Deposita:

Conta c = new Conta();

    try {
        c.deposita();
    } catch(MinhaExcecao ex) {
        System.out.println("tratamento ...."); // era para mostrar isso, não era?
        //Pois, deu erro no deposita, então pq não entra no catch? ele apresenta erro na classe invés de ser aqui...
    }
1 resposta

Hey Jade, beleza?

O fato de você ter adicionado o 'throws MinhaExcecao' no método deposita não implica que a qualquer exception que ocorra no método, vá subir MinhaExcecao. A adição do 'throws MinhaExcecao' serve de uma espécie de marcador que indica para o consumidor deste método que será necessário tratar esta exception ou que pelo menos deverá passá-la adiante.

Para que o método 'deposita' lance uma exception do tipo MinhaExcecao, será preciso interceptar a exception que está sendo "forçada" (java.lang.ArithmeticException: / by zero) e como tratamento, lançar a MinhaExecao. Ou, por exemplo, implementar alguma validação, que caso não seja atendida, lance a exception MinhaExcecao.

    public void deposita() throws MyException {

        try {
            double a=9/0;
        } catch (Exception e) {
            throw new MyException("Não é possível divisão por zero");
        }

    }

Observe o resultado da execução da classe TestaContaComCheckedException, desta maneira, a execução entra no 'catch':

tratamento..........
MyException: Não é possível divisão por zero
    at Conta.deposita(Conta.java:8)
    at TestaContaComCheckedException.main(TestaContaComCheckedException.java:6)

Em resposta a pergunta:

System.out.println("tratamento ...."); // era para mostrar isso, não era?
        //Pois, deu erro no deposita, então pq não entra no catch? ele apresenta erro na classe invés de ser aqui...

Não entrou no catch pois ele vai interceptar a exception específica 'MinhaExecao' que não foi a exception lançada pela implementação 'double a=9/0;'. Para interceptar a exception lançada pelo erro, deveria usar o tipo mais genérico: 'Exception' no catch.

Espero ter ajudado!

Abs, ;)