Da trilha de Java Este conceito ainda não saiu como card do dia. ir para o card de hoje

Java Erros Intermediário

try-with-resources

O try-with-resources é um recurso do Java (introduzido no Java 7) que garante que recursos abertos sejam fechados automaticamente ao final do bloco, mesmo que ocorram exceções. Um recurso é qualquer objeto que implemente a interface AutoCloseable (ou sua subinterface Closeable), como FileInputStream, BufferedReader, Scanner, Connection, etc.

A sintaxe básica é:

try (Recurso r = new Recurso()) {
    // usa r
} catch (Exception e) {
    // trata exceções
}

O método close() do recurso é chamado automaticamente na ordem inversa da declaração. Se ocorrerem exceções tanto no bloco try quanto no close(), a exceção do try é propagada e as do close() são suprimidas (adicionadas como suppressed exceptions), acessíveis via Throwable.getSuppressed().

Você pode declarar múltiplos recursos no mesmo try, separados por ponto e vírgula. Isso simplifica o código e evita vazamentos de recursos. O try-with-resources substitui o padrão antigo com finally, tornando o código mais limpo e seguro.

Pontos-chave

  • Qualquer classe que implemente AutoCloseable pode ser usada em try-with-resources.
  • O método close() é chamado automaticamente ao final do bloco, mesmo em caso de exceção.
  • Múltiplos recursos podem ser declarados no mesmo try, separados por ;.
  • Exceções lançadas pelo close() são suprimidas se já houver uma exceção no bloco try.
  • Use Throwable.getSuppressed() para inspecionar exceções suprimidas.
TryWithResourcesDemo.java
import java.io.*;
import java.util.Scanner;

public class TryWithResourcesDemo {
    public static void main(String[] args) {
        // Cria um arquivo temporário para o exemplo
        File tempFile = new File("exemplo.txt");
        try (PrintWriter writer = new PrintWriter(tempFile)) {
            writer.println("Olá, try-with-resources!");
            writer.println("Segunda linha.");
        } catch (FileNotFoundException e) {
            System.err.println("Erro ao criar arquivo: " + e.getMessage());
            return;
        }

        // Lê o arquivo usando try-with-resources com múltiplos recursos
        try (FileReader fr = new FileReader(tempFile);
             BufferedReader br = new BufferedReader(fr)) {
            String linha;
            while ((linha = br.readLine()) != null) {
                System.out.println(linha);
            }
        } catch (IOException e) {
            System.err.println("Erro ao ler arquivo: " + e.getMessage());
        }

        // Exemplo de exceção suprimida: recurso que falha no close()
        try (RecursoQueFalha r = new RecursoQueFalha()) {
            throw new RuntimeException("Exceção no corpo do try");
        } catch (Exception e) {
            System.out.println("Exceção capturada: " + e.getMessage());
            for (Throwable sup : e.getSuppressed()) {
                System.out.println("  Suprimida: " + sup.getMessage());
            }
        }

        // Limpa o arquivo temporário
        tempFile.delete();
    }
}

class RecursoQueFalha implements AutoCloseable {
    @Override
    public void close() throws Exception {
        throw new Exception("Falha ao fechar o recurso");
    }
}

Exercícios

  1. 1
    Fácil

    Leitura de arquivo com try-with-resources

    Escreva um programa que leia o arquivo dados.txt (crie-o com algumas linhas) e imprima cada linha no console. Use try-with-resources para garantir que o arquivo seja fechado automaticamente.

    Resolver
  2. 2
    Médio

    Cópia de arquivo com múltiplos recursos

    Implemente um programa que copie o conteúdo de origem.txt para destino.txt. Use try-with-resources com múltiplos recursos (leitura e escrita) no mesmo bloco. Se origem.txt não existir, crie-o com um conteúdo de exemplo antes da cópia.

    Resolver
  3. 3
    Desafio

    Recurso customizado com exceções suprimidas

    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.

    Resolver

Continue estudando