Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Try / catch não está seno lido


public class Fluxo {

    public static void main(String[] args) {
        System.out.println("Ini do main");
        try {
            metodo1();
        } catch (ArithmeticException | NullPointerException ex) {
            String msg = ex.getMessage();
            System.out.println("Exception " + msg);
            ex.printStackTrace();

        }
        System.out.println("Fim do main");
    }

    private static void metodo1() {
        System.out.println("Ini do metodo1");
        metodo2();

        System.out.println("Fim do metodo1");
    }

    private static void metodo2() {
        System.out.println("Ini do metodo2");
        for (int i = 1; i <= 5; i++) {
            System.out.println(i);
            int a = i / 0;
            //Conta c = null;
            //c.deposita();

        }

        System.out.println("Fim do metodo2");
    }
}

console:

java.lang.ArithmeticException: / by zero

at Fluxo.metodo2(Fluxo.java:28)

at Fluxo.metodo1(Fluxo.java:19)

at Fluxo.main(Fluxo.java:7)

2 respostas
solução!

Oi Gabriela, tudo bem?

Talvez você esteja com a sensação de que o código não esteja funcionando devido ao fato da exceção estar ocorrendo e estar printando o traceback(rastros de erro) dessa exceção. Testei o seu código e está funcionando corretamente:

Código testado

Vamos analisar o trecho abaixo

 int a = i / 0;

Note que não é possível realiza uma divisão, então o que ocorre é:

  • O código tenta executar o método 1
  • Dentro do método 1, iremos fazer a chamada do método 2 que é onde temos a divisão por 0
  • Com isso, nos é levantada uma exceção do tipo: ArithmeticException
  • O bloco catch irá capturar esta exceção, fazer o print do tipo da exception: java.lang.ArithmeticException: / by zero
  • E por fim, printará o 'Fim do main'

Para ficar mais claro, coloque uma mensagem dentro do bloco catch, algo como:

 try {
         metodo1();
        } catch (ArithmeticException | NullPointerException ex) {
            System.out.println("Entrando no bloco catch");
            String msg = ex.getMessage();
            System.out.println("Exception " + msg);
            ex.printStackTrace();
 }

Agora teremos como resultado:

Resultado do código

É importante lembrar que quando utilizamos um bloco de catch é para que a exceção seja tratada, mas não quer dizer que quando o catch capturar a exceção será como se ela nunca tivesse existido, pelo contrário, dentro do bloco catch temos que fazer os procedimentos para informar o usuário sobre aquela exceção ou chamar outros métodos, se for o caso.

No código que você disponibilizou, o que faz parecer que há algum erro quando ocorre a exceção, porque é printado o traceback da exceção, na linha: ex.printStackTrace();

Ficou mais claro? Qualquer dúvida é só falar.

Bom dia Maria! Sim é verdade... O restante do resultado estava para cima da barra de rolagem! Falta de atenção, acho que o cérebro já estava cansado... rsrs Mas de qualquer forma mto obrigada... Adorei a tua explicação ;)