Como evitar vazamento de recursos com o try-with-resources em Java

Por Gaspar Barancelli Junior em 08 de março de 2023

O try-with-resources é um recurso introduzido no Java 7 que permite que objetos que implementam a interface java.lang.AutoCloseable ou java.io.Closeable, como conexões de banco de dados ou arquivos, sejam gerenciados automaticamente e fechados corretamente, sem a necessidade de usar um bloco finally.

A interface AutoCloseable é uma interface funcional introduzida no Java 7 que define um único método close(), que é chamado quando um recurso precisa ser fechado. A interface Closeable é uma subinterface de AutoCloseable que adiciona o método close() à exceção IOException.

Portanto, qualquer recurso externo que implemente a interface AutoCloseable ou Closeable, pode ser usado com o try-with-resources. Alguns exemplos comuns de recursos que podem ser usados com o try-with-resources são: FileReader, BufferedReader, FileWriter, BufferedWriter, Socket, ServerSocket, Connection, Statement, ResultSet, entre outros.

Exemplo de implementação em Java

Para usar o try-with-resources, basta declarar o recurso no cabeçalho do bloco try, seguido pelo bloco de código que irá utilizar o recurso. O recurso será automaticamente fechado quando o bloco try for concluído, independentemente se ocorreu uma exceção ou não. Aqui está um exemplo de como usar o try-with-resources com um FileReader e BufferedReader para ler um arquivo de texto:

try (FileReader reader = new FileReader("arquivo.txt");
     BufferedReader br = new BufferedReader(reader)) {

    String linha;
    while ((linha = br.readLine()) != null) {
        System.out.println(linha);
    }

} catch (IOException e) {
    e.printStackTrace();
}

Neste exemplo, declaramos dois recursos: um FileReader e um BufferedReader. Quando o bloco try é iniciado, o arquivo é aberto e o buffer é criado. Dentro do bloco try, podemos ler o conteúdo do arquivo usando o método readLine() do BufferedReader.

No final do bloco try, não precisamos nos preocupar em fechar o arquivo e o buffer explicitamente, pois o Java irá fechá-los automaticamente. Isso é útil porque evita que esqueçamos de fechar um recurso e causemos um vazamento de recursos ou corrupção de dados.

Além disso, o try-with-resources é mais conciso do que a versão anterior usando um bloco finally. Podemos realizar as mesmas tarefas com menos código e mais legibilidade.

Conclusão

Em resumo, o try-with-resources é uma adição útil e importante ao Java, que facilita a gestão de recursos externos. Com ele, podemos garantir que os recursos sejam abertos e fechados corretamente, mesmo em caso de exceção. Se você ainda não está usando o try-with-resources em seu código Java, agora é a hora de começar a usá-lo!

// Livros recomendados relacionados ao assunto do post

// Compartilhe esse Post