Dominando Tratamento de Exceções em Java: Try, Catch, Finally, Throw e Throws Explicados
Dominando Tratamento de Exceções em Java
Este guia percorre os mecanismos de tratamento de exceções do Java — try-catch, finally, throw e throws — com exemplos claros e dicas de boas práticas.
Na lição anterior introduzimos exceções Java e por que interrompem fluxo de programa. Tratar essas exceções graciosamente é essencial para código robusto e sustentável.
Abaixo estão as estratégias primárias para gerenciar exceções em Java:
- blocos try…catch
- blocos finally
- palavras-chave throw e throws
1. Usando Bloco try…catch
A construção try…catch é a pedra angular do modelo de tratamento de erros do Java. Coloque qualquer código que possa lançar exceção dentro do bloco try, e capture exceções específicas depois.
try { // código que pode lançar } catch(Exception e) { // tratar exceção }
A cláusula catch é obrigatória sempre que um bloco try aparece; ela intercepta a exceção e permite resposta apropriada.
Exemplo: Tratando ArithmeticException
class Main { public static void main(String[] args) { try { int divisaoPorZero = 5 / 0; System.out.println("Resto do código no bloco try"); } catch (ArithmeticException e) { System.out.println("ArithmeticException => " + e.getMessage()); } } }
Saída
ArithmeticException => / by zero
Neste snippet, a divisão por zero dispara ArithmeticException. A exceção é capturada, o bloco catch executa, e qualquer código após a exceção dentro do try é pulado.
Se o bloco try completa sem lançar, o bloco catch é simplesmente ignorado.
2. Aproveitando o Bloco finally
Um bloco finally sempre roda, independentemente de exceção ter sido lançada. É local ideal para tarefas de limpeza — fechar arquivos, liberar recursos ou logging.
Apenas um bloco finally pode acompanhar uma dada instrução try.
try { // código } catch (TipoExcecao1 e1) { // tratar } finally { // sempre executado }
Exemplo: finally Após Exceção
class Main { public static void main(String[] args) { try { int divisaoPorZero = 5 / 0; } catch (ArithmeticException e) { System.out.println("ArithmeticException => " + e.getMessage()); } finally { System.out.println("Este é o bloco finally"); } } }
Saída
ArithmeticException => / by zero Este é o bloco finally
O bloco finally executa após o catch, garantindo que código crítico de limpeza rode mesmo se exceção ocorrer.
Boa prática: Use finally para qualquer código que deve rodar independentemente de sucesso ou falha, como fechar streams ou resetar estado compartilhado.
3. Lançando Exceções Explicitamente e Declarando Throws
A palavra-chave throw permite lançar exceção manualmente. Quando lançada, controle salta diretamente para o catch correspondente mais próximo.
Exemplo: Usando throw
class Main { public static void dividirPorZero() { throw new ArithmeticException("Tentando dividir por 0"); } public static void main(String[] args) { dividirPorZero(); } }
Saída
Exception in thread "main" java.lang.ArithmeticException: Trying to divide by 0 at Main.dividirPorZero(Main.java:5) at Main.main(Main.java:9)
A cláusula throws, por outro lado, declara que um método pode propagar certas exceções checked. Sinaliza aos chamadores que eles devem tratar ou propagar a exceção.
Exemplo: Usando throws com I/O de Arquivo
import java.io.*; class Main { // Declarar que este método pode lançar IOException public static void encontrarArquivo() throws IOException { File novoArquivo = new File("test.txt"); FileInputStream stream = new FileInputStream(novoArquivo); } public static void main(String[] args) { try { encontrarArquivo(); } catch (IOException e) { System.out.println(e); } } }
Saída
java.io.FileNotFoundException: test.txt (O sistema não pode encontrar o arquivo especificado)
Se o arquivo não existe, FileInputStream lança FileNotFoundException, que é subclasse de IOException. Como encontrarArquivo() declara throws IOException, o método main deve tratá-la.
Quando um método não captura exceção internamente, você deve declará-la com throws para informar chamadores da falha potencial.
Para insight mais profundo, explore a documentação Java de throw e throws.
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 e Resources
- Dominando Try-With-Resources em Java: Gerenciamento Automático de Recursos Explicado
- Anotações em Java Explicadas: Tipos, Posicionamento e Exemplos Práticos
- Asserções em Java: Guia Prático para Detectar Bugs e Garantir Confiabilidade do Código