Dominando Tratamento de Exceções em Java: Try, Catch, Finally e Resources
Dominando Tratamento de Exceções em Java
Explore como os mecanismos try-catch-finally e try-with-resources do Java ajudam você a escrever código robusto e livre de erros.
A construção try…catch é central para tratamento gracioso de erros em Java. Permite que um programa antecipe problemas em tempo de execução e responda sem travar.
Abaixo está a sintaxe canônica:
try { // código que pode lançar exceção } catch (TipoExcecao e) { // tratar a exceção }
O bloco try contém código que pode lançar exceção. Se exceção ocorre, controle salta para o catch correspondente, que pode então reagir apropriadamente.
Exemplo: Tratando ArithmeticException
class Main { public static void main(String[] args) { try { int resultado = 5 / 0; System.out.println("Esta linha nunca é alcançada."); } catch (ArithmeticException e) { System.out.println("Capturado: " + e.getMessage()); } } }
Saída
Capturado: / by zero
Aqui, dividir por zero dispara ArithmeticException. O bloco catch captura, prevenindo crash do programa.
Dica: Você pode omitir o bloco catch se só tem interesse em garantir que um bloco finally rode, mas catch não pode existir sem try precedente.
Usando Bloco Finally
Uma cláusula finally garante execução independentemente de exceção ter sido lançada:
class Main { public static void main(String[] args) { try { int resultado = 5 / 0; } finally { System.out.println("Ações de limpeza rodam aqui."); } } }
Saída
Ações de limpeza rodam aqui. Exception in thread "main" java.lang.ArithmeticException: / by zero at Main.main(Main.java:4)
O bloco finally executa após o try, mesmo quando exceção interrompe fluxo normal.
Combinando Try, Catch e Finally
Código mais robusto usa todas três cláusulas para tratar erros, reportá-los e limpar recursos. Considere este exemplo de manipulação de arquivo:
import java.io.*; class ListaNumeros { private int[] lista = {5, 6, 8, 9, 2}; public void escreverLista() { PrintWriter out = null; try { System.out.println("Tentando escrever no arquivo."); out = new PrintWriter(new FileWriter("ArquivoSaida.txt")); for (int i = 0; i < 7; i++) { out.println("Valor em: " + i + " = " + lista[i]); } } catch (Exception e) { System.out.println("Exceção: " + e.getMessage()); } finally { if (out != null) { System.out.println("Fechando PrintWriter"); out.close(); } else { System.out.println("PrintWriter não aberto."); } } } } class Main { public static void main(String[] args) { new ListaNumeros().escreverLista(); } }
Saída
Tentando escrever no arquivo. Exceção: Index 5 out of bounds for length 5 Fechando PrintWriter
Observe que a violação dos limites do array dispara exceção, que é capturada e reportada. O bloco finally garante que o PrintWriter seja fechado, prevenindo vazamento de recursos.
Boa prática: Sempre coloque lógica de limpeza — fechar arquivos, sockets ou conexões de banco — em bloco finally.
Nota: finally pode não rodar se JVM sai (ex: System.exit()), exceção ocorre dentro de finally, ou thread é terminada abruptamente.
Tratando Múltiplos Tipos de Exceção
Um único try pode ser seguido por vários catch, cada um adaptado a exceção específica:
class ListaNumeros { private int[] arr = new int[10]; public void escreverLista() { try { arr[10] = 11; } catch (NumberFormatException e) { System.out.println("NumberFormatException: " + e.getMessage()); } catch (IndexOutOfBoundsException e) { System.out.println("IndexOutOfBoundsException: " + e.getMessage()); } } } class Main { public static void main(String[] args) { new ListaNumeros().escreverLista(); } }
Saída
IndexOutOfBoundsException: Index 10 out of bounds for length 10
O runtime primeiro tenta o primeiro catch; se não combina, prossegue para o próximo até encontrar correspondência.
Capturando Múltiplas Exceções em Uma Cláusula (Java 7+)
Java 7 introduziu capacidade de combinar tipos de exceção em um único catch, reduzindo duplicação:
try { // código arriscado } catch (IOException | SQLException ex) { // tratamento unificado }
Use este recurso quando diferentes exceções podem ser tratadas identicamente.
Try-With-Resources para Limpeza Automática
A instrução try-with-resources fecha automaticamente qualquer recurso que implemente AutoCloseable:
try (PrintWriter out = new PrintWriter(new FileWriter("ArquivoSaida.txt"))) { // usar recurso } catch (IOException e) { // tratar erros I/O }
Como o recurso é declarado dentro dos parênteses, é fechado automaticamente quando o bloco sai, mesmo se exceção ocorre.
Para insights mais profundos, explore documentação oficial Java sobre try-with-resources.
Java
- Dominando Operadores Java: Tipos, Sintaxe e Exemplos Práticos
- Comentários em Java: Tipos, Uso e Boas Práticas
- Dominando o Loop for Aprimorado em Java: Sintaxe, Exemplos e Boas Práticas
- Dominando Strings em Java: Criação, Métodos e Boas Práticas
- Dominando Interfaces em Java: Conceitos, Implementação e Boas Práticas
- Dominando Classes Internas Anônimas em Java: Definição, Sintaxe e Exemplos Práticos
- Dominando Tratamento de Exceções em Java: Try, Catch, Finally, Throw e Throws Explicados
- Dominando Tratamento Multi-Exceção em Java
- Dominando Try-With-Resources em Java: Gerenciamento Automático de Recursos Explicado
- Anotações em Java Explicadas: Tipos, Posicionamento e Exemplos Práticos