Dúvida no tratamento de exceções

Eu estou estudando pelo livro “Java, how to program”. Me surgiu uma dúvida no tratamento de exceções, com relação às seguintes afirmações do livro:

Afirmação 1:

It’s a compilation error to catch the
exact same type in two different catch blocks associated with a particular try block.

Afirmação 2:

Catching subclass types individually is subject to error if you forget to test for one or more
of the subclass types explicitly; catching the superclass guarantees that objects of all subclasses
will be caught. Positioning a catch block for the superclass type after all other subclass
catch blocks ensures that all subclass exceptions are eventually caught.

Na afirmação 1, ele diz que ocorre um erro se dois catch’s correspondentes a um mesmo tipo de exceção estão relacionados a ao mesmo bloco try.

Na afirmação 2, diz que pode colocar um catch “pai” depois dos catch’s “filhos”.

Aí o que me deixou em dúvida foi o seguinte código que fiz:

Criei trê novas exceções que descendem de Exception:

  • ExceptionA extends Exception
  • ExceptionB extends A
  • ExceptionC extends B

depois, fiz o teste na classe main:

try
{
 throw new ExceptionC();
}
catch(ExceptionC e)
{
 System.out.printf(“Captando o erro do tipo ExceptionC”);
}

catch(ExceptionA e)
{
 System.out.printf(“Captando o erro do tipo ExceptionA”);
}

Quando vou compilar, o código da o seguinte erro:

unreachable catch clause
catch(ExceptionA e)

Eu não entendi o porque do erro, e por isso copiei as passagens do livro. Cheguei à conclusão de que o erro de compilação ocorre porque a classe ExceptionC é um ExceptionA. Mas outra parte do livro diz que pode colocar a classe pai abaixo das filhas.

Fiz outro teste: no lugar da classe ExceptionA, coloquei apenas Exception e o programa compilou normalmente.

Alguém sabe me explicar o motivo desse erro?

O compilador é inteligente e percebeu que a única coisa que você faz no seu bloco try é lançar uma exceção do tipo ExceptionC. Ou seja, o bloco catch de ExceptionA jamais será executado e ele está te avisando que isso é código morto.

1 curtida

Eu pensei nessa possibilidade, por isso fiz o teste, também, com o tipo Exception e o erro não ocorreu. Sabe explicar o porquê?

Já tentou usar catch multiplo?

catch(ExceptionC e | Exception a)
{
 System.out.printf("Captando o erro do tipo ExceptionC ou ExceptionA");
}

Algo assim, não testei para ver exatamente a sintaxy

1 curtida

Deve dar certo, sim. Mas eu quero saber mais por fins de aprendizado do motivo o qual não compila. Esse código que fiz é por causa de um exercício do livro.

Mas é o que eu fiz :grin:
A menos que minha compreensão esteja errada. O ExceptionC é descendente do ExceptionA, portanto, é mais específico, não?

Sim, eu li teu código errado! :smiley:

Já apaguei a outra resposta. Acredito que não seja um erro de compilação, mas sim um warning. Pelo menos, no Eclipse aparece como warning.

1 curtida

Eu não conhecia essa do warning. Desculpe tomar o tempo de vcs. Foi isso mesmo que aconteceu, ele compilou e deu um warning.

Fico mto agradecido pela ajuda!!!