Tratamento de Erros em Java: try/catch e muito mais — guia completo

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: Por que o tratamento de erros é crítico para o desenvolvedor Java

Qualquer programa que vá além do "Hello, World!" enfrenta situações imprevistas: o usuário digita letras em vez de números, arquivo não encontrado, rede indisponível. Em Java, para esses casos, foi desenvolvido um mecanismo poderoso e elegante de exceções (exceptions). O tratamento adequado de erros não é apenas "ignorar o problema", mas sim criar um código robusto, previsível e seguro.

Neste artigo, abordaremos não apenas a construção clássica try/catch, mas também técnicas avançadas: try-with-resources, criação de exceções próprias e best practices que ajudarão você a escrever código profissional em Java.



1. Fundamentos: Hierarquia de exceções e a construção try/catch/finally

Antes de capturar erros, é preciso entender sua natureza. Em Java, todas as exceções são herdeiras da classe Throwable. Os ramos principais são Exception (exceções que podem e devem ser tratadas) e Error (erros críticos da JVM, que não faz sentido tratar).

A divisão chave dentro de Exception é entre exceções checked (verificadas) e unchecked (não verificadas).

  • Checked exceptions (por exemplo, IOException, SQLException) — o compilador obriga você a tratá-las. São falhas externas previsíveis.
  • Unchecked exceptions (herdeiras de RuntimeException: NullPointerException, ArrayIndexOutOfBoundsException) — erros de lógica do programa. O compilador não exige o tratamento delas, mas isso não significa que possam ser ignoradas.


Construção básica try-catch-finally

A forma mais comum de tratamento é o bloco try, que contém o código "perigoso", e um ou mais blocos catch para capturar tipos específicos de exceções.

import java.io.*;

public class ReadFileExample { public static void main(String[] args) { BufferedReader reader = null; try { reader = new BufferedReader(new FileReader("data.txt")); String line = reader.readLine(); System.out.println("Lido: " + line); } catch (FileNotFoundException e) { System.err.println("Erro: Arquivo não encontrado! " + e.getMessage()); } catch (IOException e) { System.err.println("Erro de entrada/saída: " + e.getMessage()); } finally { // finally é executado SEMPRE, mesmo se houve exceção ou return try { if (reader != null) { reader.close(); // Importante fechar o recurso } } catch (IOException e) { System.err.println("Erro ao fechar o arquivo: " + e.getMessage()); } } }}

Importante: O bloco finally é necessário para a limpeza garantida de recursos (fechamento de arquivos, conexões com banco de dados). No entanto, a partir do Java 7, surgiu uma forma mais elegante.



2. Abordagem moderna: try-with-resources (Java 7+)

Esquecer de fechar um arquivo ou conexão é um dos erros mais comuns de iniciantes. A construção try-with-resources fecha automaticamente todos os recursos que implementam a interface AutoCloseable (ou Closeable). O código fica mais curto, limpo e seguro.

import java.io.*;

public class TryWithResourcesExample { public static void main(String[] args) { // Os recursos são declarados entre parênteses após o try try (BufferedReader reader = new BufferedReader(new FileReader("data.txt")); BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {

String line; while ((line = reader.readLine()) != null) {

Blogs

Book Recommendations