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 MeuRecurso deve implementar AutoCloseable e lançar uma exceção no close().
  • 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

  1. Definimos a classe MeuRecurso que implementa AutoCloseable.
  2. No método close(), lançamos uma Exception com a mensagem "Falha ao fechar o recurso".
  3. No main, usamos try-with-resources para criar MeuRecurso.
  4. Dentro do bloco try, lançamos uma RuntimeException com "Falha no corpo do try".
  5. Ao sair do bloco, o close() é chamado e lança outra exceção. Como já havia uma exceção no corpo, a do close() é suprimida.
  6. No catch, imprimimos a exceção principal e iteramos sobre e.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 Throwable em vez de Exception: getSuppressed() está em Throwable, mas Exception é 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