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

Dúvida com a explicação

No treco da explicação em que o catch está localizado no m1(), ele imprime o seguinte:

inicio main
inicio m1 
inicio m2
0
2
4
6
8
problema
fim m2
fim m1
fim main

Porém, quando o catch está no main, ele imprime:

inicio main
inicio m1
inicio m2
0
2
4
6
8
problema
fim main

Ele não deveria imprimir o "fim m2" e "fim m1" também, já que ele seguiria o o código normalmente?

3 respostas

Oi Hudson, tudo bem ?

Cara, não entendi muito bem, será que você me mostrar o código falando o que acontece para eu tentar te ajudar ?

Opa, tudo beleza!

O código do m1() e m2():

private static void m1() {
    System.out.println("inicio m1");
    try {
        m2();
    } catch(ArrayIndexOutOfBoundsException e) {
        System.out.println("problema");
    }
    System.out.println("fim m1");
}

private static void m2() {
    System.out.println("inicio m2");

    int[] nums = new int[5];
    for(int i = 0; i < 6; i++) {
        nums[i] = i * 2;
        System.out.println(nums[i]);
    }
    System.out.println("fim m2")
    }
  }
}

Neste caso o try catch está na chamada do m2();.

No trecho em que eu falo, eles tiram o try catch do m1(); e colocam ele no main, assim:

public class TestaExcecao {

    public static void main(String[] arg) {
        System.out.println("inicio main");
        try {
            m1();
        } catch(ArrayIndexOutOfBoundsException e) {
            System.out.println("problema");
        }
        System.out.println("fim main")
}
    private static void m1() {
        System.out.println("inicio m1");
        m2();
        System.out.println("fim m1");
    }

Minha dúvida é que se a saída deveria ser a mesma de quando o try catch está dentro do m1();

solução!

Ah, entendi agora !

Bom repara o seguinte, o try ele vai cuidar caso você leve uma exception, fazendo que o sistema não exploda na sua cara, contudo tudo que ele estava fazendo é parado e dali vai para seu tratamento no catch.

Na primeira vez que você rodou, com o try no m1, ele estourou dentro do for, mas como seu tratamento era no método, ele simplesmente saiu e encerrou o m2 e em seguida o m1.

Já na segunda vez o tratamento foi para o m1, como não foi ele quem deu problema, e sim a invocação do método m2, o java para todo fluxo e retorna para o tratamento, que é realizado na sua main

Espero ter ajudado.

Abraços