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
AutoCloseablepode 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 blocotry. - Use
Throwable.getSuppressed()para inspecionar exceções suprimidas.
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");
}
}