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

[Dúvida] Hierarquia de exceções no bloco try/catch

Olá, eu estava lendo Para saber mais: hierarquia de exceptions no Java e me deparei com a seguinte frase "É possível capturar exceções de uma classe mãe em um bloco catch que captura exceções de uma classe filha. No entanto, o inverso não é possível. Isso significa que, se um bloco catch captura exceções de uma classe filha, ele não será capaz de capturar exceções de uma classe pai.", a qual não consegui entender a diferença das duas situações.

3 respostas

Olá Leonardo!

Entendo que você está com dúvidas sobre a hierarquia de exceções no bloco try/catch em Java. Vou tentar te ajudar a entender a diferença entre as duas situações mencionadas.

No Java, as exceções são organizadas em uma hierarquia de classes, onde todas as exceções são subclasses da classe Throwable. Essa classe possui duas subclasses principais: Exception e Error.

As exceções que herdam da classe Exception são chamadas de exceções verificadas (checked exceptions). Isso significa que essas exceções devem ser tratadas explicitamente em um bloco try-catch ou declaradas em uma cláusula throws na assinatura do método. Um exemplo é a classe de exceção IOException, que indica algum problema relacionado com leitura/escrita de dados.

Já as exceções que herdam da classe Error representam erros irrecuperáveis pelo sistema, como falta de memória ou falhas internas. Um exemplo é a classe de exceção OutOfMemoryError, que indica que o Java não conseguiu memória suficiente do sistema operacional para executar corretamente a aplicação.

Além disso, existe a classe de exceção RuntimeException, que é uma subclasse direta de Exception, e as classes que herdam dela são chamadas de exceções não verificadas (unchecked exceptions). Essas exceções indicam erros lógicos no código, como a NullPointerException, que indica o acesso a algum atributo ou método de um objeto que é nulo.

A diferença entre capturar exceções de uma classe mãe em um bloco catch que captura exceções de uma classe filha e o inverso é a seguinte: é possível capturar exceções de uma classe mãe em um bloco catch que captura exceções de uma classe filha, mas não é possível capturar exceções de uma classe pai em um bloco catch que captura exceções de uma classe filha.

Por exemplo, se tivermos um bloco catch que captura exceções de uma classe filha IOException, ele também será capaz de capturar exceções da classe mãe Exception. No entanto, se tivermos um bloco catch que captura exceções de uma classe mãe Exception, ele não será capaz de capturar exceções de uma classe filha IOException.

Isso acontece porque a hierarquia de exceções segue a lógica de que uma classe filha é mais específica do que uma classe mãe. Portanto, um bloco catch que captura exceções de uma classe filha pode lidar com exceções mais específicas, mas não pode lidar com exceções mais genéricas.

Espero que essa explicação possa te ajudar a entender a diferença entre as duas situações. Se tiver mais alguma dúvida, é só me dizer!

Espero ter ajudado e bons estudos!

Olá, pessoal! Estou com dúvida em relação a isso também, a explicação presente no curso é confusa e parece contraditória.

"É possível capturar exceções de uma classe mãe em um bloco catch que captura exceções de uma classe filha. No entanto, o inverso não é possível. Isso significa que, se um bloco catch captura exceções de uma classe filha, ele não será capaz de capturar exceções de uma classe pai."

A primeira frase diz: bloco catch que captura exceções de uma filha -> captura exceções da mãe

A segunda: bloco catch que captura exceções de uma filha -> não captura exceções do pai

Estou com bastante dúvida, pois até nem conseguir comprovar no código, esse pensamento descrito.

O comportamento que encontrei é justamente o oposto, que um bloco catch com "Exception" conseguirá capturar todas as classes filhas. Já um catch mais específico, só capturará as classes que estão abaixo dessa hierarquia.

Isso faz sentido?

solução!

eu não fiz o curso então não sei o motivo da confusão. mas pense assim, existem várias exceptions, de banco de dados, de formatação, de arquivos, de conversão. se num bloco try/catch, o seu primeiro catch for Exception, qualquer outra exceção que estejam nos catchs seguintes, mesmo que ocorram vão cair sempre o catch do exception. e tipo assim. vc tem o carro, tem. montadora, e tem os modelos. vc tem então o UnoException, o FiatException e o CarroException que todos herdam dele. aí no seu bloco try/catch vc começa com Carro, por mais que ocorra um UnoException, vai sempre cair no Carro pq um uno também é um carro