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

Exception

Então no caso abaixo, só mostra uma exceção ?

Caso o erro esteja na primeira exceção ele sobrepõe a segunda ?

Como faço para mostrar as duas exceções ao mesmo tempo?

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

Não sei se entendi sua dúvida, porém, no caso são duas excessões diferentes, não tem como ser as duas ao mesmo tempo. Uma se trata de uma referencia vazia e a outra de problema aritmetico.

Se o problema for aritmetico, a excessão será ArithmeticException, logo resultará no primeiro catch. Caso encontre uma referencia vazia, resultará no segundo catch, NullPointerException.

Primeiramente obrigado pela resposta!

Por exemplo nesse código do curso mesmo , ao compilar ele , levando em conta o tratamento das exceções que postei a cima. Ele só gera a exceção da divisão por zero e não mostra o null .

Isto que não entendi , se tem dois tratamentos, porque não aparece os dois erros somente um ?

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

Desculpa a demora, para responder... Então, o try catch faz o seguinte, ela executa o metodo1, certo?

try {
    metodo1()
}

logo depois tem os catchs:

catch(ArithmeticException ex) {
    ...
}
catch(NullPointerException ex){
    ...
}

porém, se você prestar atenção no que vem depois do catch você vai entender: ArithmeticException ex, só vai entrar nesse bloco catch, se na execução encontrar uma exceção aritmetica, como é a divisão por 0. No caso do catch NullPointerException ex só vai entrar nesse bloco se encontrar uma variável vazia, por exemplo: int a = i / b; considerando que você não criou uma variável b. Pode inclusive testar, e vai ver que a exceção agora vai ser NullPointerException, não tem como ser as duas exceções ao mesmo tempo.

Só para concluir, caso não tenha sido claro, null é quando uma variável não aponta para nenhum objeto, o seu código não tem nenhuma variável null, mas sim uma divisão por 0, não tem como tratar para uma exceção NullPointer quando não existe nada null no seu código.

solução!

Aparece somente um porque o primeiro erro encontrado é o de: int a = i / 0; (ArithmeticException), e quando encontra esse erro é "encerrado" o método 2, ou seja,

Conta c = null;
c.deposita();

não é executada essas linhas. Faça o teste, coloque int a = i / 0; embaixo do código acima. E vc verá que irá aparecer apenas a msg do catch(NullPointerException ex).

zappaftw , robsonhenrique16Obrigado pelas respostas, compreendi totalmente , abraço !!