DT

Danilo Trindade07/03/2023 12:53
Compartilhe

Múltiplas Exceções em Java - Uma visão mais profunda

  • #Java

Recentemente compartilhei um artigo falando brevemente sobre esse assunto, agora gostaria de compartilhar o mesmo tema analisando mais profundamente alguns pontos importantes. Este artigo nasceu a partir de uma discussão no fórum da faculdade onde se questionava sobre o retorno e o erro de compilação, essa foi a explicação que dei a um colega, espero que ajude você também.

Realmente o código não compila, pois mesmo considerando os valores de a e b iguais a 0 (zero) o código não compila pelo fato da hierarquia em que as múltiplas exceções organizadas dentro dos catchs estarem incorretas, segundo as regras de implementação das exceções.

Por isso fiz essas imagens baseado nos testes e na explicação do professor: "devemos especificar as exceções da mais específica para a mais genérica", isso significa que se os problemas mais específicos que você está tentando tratar dentro dos primeiros catchs não ocorrerem, o problema que acontecer será tratado pela RuntimeException, que é a classe mais genérica dentro dessa hierarquia e deveria estar no último catch.

image

A exceção no console diz que a classe RuntimeException já está tratando o bloco que lançou a exceção porque ela aparece primeiro na lista de catchs. Quando a classe dentro do segundo catch tentou tratar o erro de aritmética (divisão por zero) ela recebeu um alerta do compilador dizendo que sua mãe já está cuidando desse assunto.

Por esse motivo, se mudarmos a ordem dos catchs o código irá compilar e retornar o valor 0 porque ocorrerá um erro de aritmética (divisão por zero) e a classe específica para tratar esse tipo de exceção ArithmeticException será executada porque será a primeira da lista. Como não há nenhuma impressão do retorno, fiz uma alteração para que o retorno seja exibido no console.

image

Como podemos ver, a depender do que se pede no enunciado, baseado no retorno apresentado no console, até poderia ser a alternativa D (concluido0), mas não foi o caso. Por isso, a imagem abaixo explica esse comportamento e o motivo pelo qual a alternativa correta seria aquela afirmando que o código não compila.

image

Observação: A saída no console foi "concluido0" porque o bloco finally sempre será executa independente se o bloco try teve sucesso ou não. Por isso, "concluido" é o texto definido no bloco finally e "0" é efetivamente o valor retornado pelo catch.

Assim, espero que essa explicação te ajude a entender não só o motivo pelo qual esse erro de compilação acontece, como também a importância de conhecer a hierarquia das classes responsáveis por tratar exceções em Java.

Se aprofunde mais no assunto estudando:

Compartilhe
Comentários (1)
Reinaldo Caetano
Reinaldo Caetano - 07/03/2023 13:10

Conteudo Show !!!!