Desafio Java
Recurso customizado com exceções suprimidas
Enunciado
Crie uma classe MeuRecurso que implemente AutoCloseable e simule uma falha no método close(). No main, use try-with-resources para instanciar MeuRecurso e lance uma exceção dentro do bloco try. Capture a exceção e imprima a mensagem da exceção principal e de todas as exceções suprimidas.
Requisitos
- A classe
MeuRecursodeve implementarAutoCloseablee lançar uma exceção noclose(). - O bloco try-with-resources deve lançar uma exceção no corpo do try.
- O catch deve imprimir a exceção principal e as suprimidas usando
getSuppressed(). - A saída deve listar a exceção principal e pelo menos uma suprimida.
Código inicial
public class TesteRecurso {
public static void main(String[] args) {
// Seu código aqui
}
}
class MeuRecurso implements AutoCloseable {
// Implemente close()
}
Saída esperada
Exceção principal: Falha no corpo do try
Suprimida: Falha ao fechar o recurso
Ver dica
No close(), lance uma Exception com mensagem. No main, use try-with-resources e lance new RuntimeException("Falha no corpo do try"). No catch, itere sobre e.getSuppressed().
Mostrar solução
public class TesteRecurso {
public static void main(String[] args) {
try (MeuRecurso r = new MeuRecurso()) {
// Simula uma exceção no corpo do try
throw new RuntimeException("Falha no corpo do try");
} catch (Exception e) {
System.out.println("Exceção principal: " + e.getMessage());
for (Throwable sup : e.getSuppressed()) {
System.out.println("Suprimida: " + sup.getMessage());
}
}
}
}
class MeuRecurso implements AutoCloseable {
@Override
public void close() throws Exception {
throw new Exception("Falha ao fechar o recurso");
}
}
Passo a passo
- Definimos a classe
MeuRecursoque implementaAutoCloseable. - No método
close(), lançamos umaExceptioncom a mensagem "Falha ao fechar o recurso". - No
main, usamos try-with-resources para criarMeuRecurso. - Dentro do bloco
try, lançamos umaRuntimeExceptioncom "Falha no corpo do try". - Ao sair do bloco, o
close()é chamado e lança outra exceção. Como já havia uma exceção no corpo, a doclose()é suprimida. - No
catch, imprimimos a exceção principal e iteramos sobree.getSuppressed()para mostrar as suprimidas.
Por que funciona
Quando uma exceção é lançada no bloco try e outra no close(), a exceção do try é propagada e a do close() é anexada como suprimida. Isso evita que a exceção original seja mascarada. O método getSuppressed() retorna um array com todas as exceções suprimidas.
Erros comuns
- Não implementar
AutoCloseable: O try-with-resources só aceita recursos que implementam essa interface. - Esquecer de lançar exceção no
close(): Sem isso, não há exceção suprimida para demonstrar. - Capturar
Throwableem vez deException:getSuppressed()está emThrowable, masExceptioné suficiente para o exemplo. - Não iterar sobre
getSuppressed(): Se não imprimir, não se vê o efeito.
Outra forma de resolver
Pode-se usar addSuppressed() manualmente em um bloco finally, mas o try-with-resources faz isso automaticamente.
Saída esperada
Exceção principal: Falha no corpo do try
Suprimida: Falha ao fechar o recurso