Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Singularidades

Ola pessoal,

Eu percebi que ao fazermos o try catch sem o throw new ..., o programa retorna ao primeiro metodo invocado, bem como termina de ler o resto do metodo onde o erro ocorreu.

Já o try catch sem throw new ..., ele encerra onde o erro ocorreu e não faz mais nada, fazendo com que o programa seja encerrado através do primeiro metodo invocado. Está correto isso? Se sim, isso quer dizer que damos um throw new... para evitar que a aplicação leia o resto do metodo posterior ao problema ocorrido nele?

Segue abaixo dois testes que fiz. O nome da classe descreve o cenário que eu entendi:

package br.com.alura.exceptions;

public class FluxoComInterrupcao {

    public static void main(String[] args) {

        System.out.println("Ini do main");
        try {
            metodo1();
        } catch (ArithmeticException | NullPointerException | MinhaExcecao ex) {
            String msg = ex.getMessage();
            System.out.println("Exception do metodo1 " + msg);
            ex.printStackTrace();
        }
        System.out.println("Fim do main");
    }

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

        metodo2();

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

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

            throw new MinhaExcecao("deu muito errado");
        }
        int a = 1;
        int b = 2;
        System.out.println(a + b);
        System.out.println("Fim do metodo2");
    }
}

Resultado: Ini do main

Ini do metodo1

Ini do metodo2

Exception do metodo1 / by zero

java.lang.ArithmeticException: / by zero

Fim do main

at .br.com.alura.exceptions.FluxoComInterrupcao.metodo2(FluxoComInterrupcao.java:28)
at .br.com.alura.exceptions.FluxoComInterrupcao.metodo1(FluxoComInterrupcao.java:21)
at .br.com.alura.exceptions.FluxoComInterrupcao.main(FluxoComInterrupcao.java:9)

Reparem que a classe acima não leu o resto do último metodo 2 onde o erro ocorreu. Lembrando que o erro ocorreu antes do metodo 2 terminar, ou seja, ele não somou as variaveis a** e **b

Agora, a segunda classe:

package br.com.alura.exceptions;

public class Fluxo {

    public static void main(String[] args) {

        System.out.println("Ini do main");

        metodo1();
        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");

        try {
            int a = 1 / 0;

            for (int i = 1; i <= 5; i++) {
                System.out.println(i);
                Cliente c = null;
                c.deposita();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        int a = 1;
        int b = 4;
        System.out.println(a + b);
        System.out.println("Fim do metodo2");
    }
}

Ini do main

Ini do metodo1

Ini do metodo2

5

Fim do metodo2

Fim do metodo1

Fim do main

java.lang.ArithmeticException: / by zero

at br.com.alura.exceptions.Fluxo.metodo2(Fluxo.java:25)
at br.com.alura.exceptions.Fluxo.metodo1(Fluxo.java:16)
at br.com.alura.exceptions.Fluxo.main(Fluxo.java:9)

Perceberam que aqui, o metodo 2 continua a executar a lógica, mesmo que tenha ocorrido erro em alguma lógica anterior dentro do metodo 2?

Obgdo galera

1 resposta
solução!

Oi John, muitas vezes o try/catch está envolvido com alguma operação fundamental sem o qual a aplicação não poderia continuar a executar normalmente.

Vejamos: caso sua aplicação use um banco de dados, faria sentido ela continuar executando sem essa conexão ao banco? Não! Por isso é comum que se lance uma exceção parando a execução da aplicação.

Isso não quer dizer necessariamente que a aplicação vai parar de funcionar. Podemos tentar novamente uma conexão depois de um tempo pra fazer com que a aplicação se recupere.

Faz sentido? De alguma forma acho que você deixou a sua pergunta um pouco confusa.