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

Fim do main aparece antes do rastro

Olá, no meu console o rastro aparece depois do "Fim do main", assim:

Ini do main Ini do metodo1 Ini do metodo2 Exceção Deu errado. MinhaExcecao: Deu errado. Fim do main at Fluxo.metodo2(Fluxo.java:26) at Fluxo.metodo1(Fluxo.java:19) at Fluxo.main(Fluxo.java:7)

Contudo, o "Fim do main" não deveria aparecer depois. Porque isso acontece?

public class Fluxo {

    public static void main(String[] args) {
        System.out.println("Ini do main");

        try {
            metodo1();
        } catch(ArithmeticException | NullPointerException 
                | MinhaExcecao ex) {
            String msg = ex.getMessage(); // mensagem original da exception
            System.out.println("Exceção " + msg);
            ex.printStackTrace(); // rastro da exception
        }

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

        throw new MinhaExcecao("Deu errado.");

        //System.out.println("Fim do metodo2");
    }
}
1 resposta
solução!

Segundo a doc (https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html#printStackTrace--), o printStackTrace(), escreve no stream de erro (https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#err), enquanto println escreve no output stream padrão (https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#out).

Esse comportamento pode acontecer, pq o momento de flush (https://docs.oracle.com/javase/8/docs/api/java/io/PrintStream.html#flush--) dos streams podem ser diferentes, o stream de erros pode ficar em buffer por mais tempo.