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

[Dúvida] Referência do tipo Exception no catch

Na aula, o professor disse que é necessário passar no catch() o tipo da referência sendo o nome da exceção. No entanto, reparei que se usar o tipo Exception funciona sem problemas.

try {
    metodo1();
} catch (ArithmeticException | NullPointerException  e)  {
    String msg = e.getMessage();
    System.out.println("Exception: " + msg);
    e.printStackTrace();
}
try {
    metodo1();
} catch (Exception e)  {
    String msg = e.getMessage();
    System.out.println("Exception: " + msg);
    e.printStackTrace();
}

Ambos funcionam da mesma forma e o segundo caso é até mais simples pois engloba todas as exceções. Isso está correto?

2 respostas
solução!

Fala João, tudo bem?

De fato, utilizar a referência Exception funciona devido ao polimorfismo. No entanto, ao utilizar esse tipo de referência, perdemos um pouco o controle do nosso código, e de que tipo de exceção ele pode disparar. Como assim? Digamos que tenhamos uma função que a gente saiba que dispare a ArithmeticException e NullPointerException, como no seu exemplo. Nós sabemos exatamente quais exceções podem acontecer, e como vamos tratá-las. Quando utilizamos o tipo mais genérico, podem ocorrer outras exceções inesperadas, que podem inclusive não ser tratadas corretamente.

Portanto, até por uma questão de legibilidade de conhecer o código e seu comportamento, seria uma boa prática utilizar os tipos específicos das exceções, ao invés do genérico Exception, apesar deste último funcionar para todo caso.

Fico à disposição!

Um grande abraço e bons estudos!

Muito obrigado pelo esclarecimento, Arthur! Sua explicação está excelente.