1. Conhecendo as exceções
Vamos começar com uma analogia simples. Imagine que seu programa — é um carro que está seguindo pela estrada. Tudo vai bem até que algo inesperado acontece: o pneu murcha, o combustível acaba, o motor superaquece. Se você não “tratar” essa situação (por exemplo, colocar o estepe ou abastecer), o carro vai parar e não seguirá adiante. Da mesma forma no programa: se a exceção não for tratada, o programa encerrará abruptamente.
Exceção (exception) — objeto criado no momento em que ocorre algum problema durante a execução do programa. A exceção avisa: “Pare! Algo deu errado!”
Exemplos de situações em que ocorrem exceções:
- Divisão por zero (10 / 0)
- Tentativa de acessar um elemento inexistente do array (arr[999])
- Abrir um arquivo que não existe no disco
- Converter a string "abc" em número (Integer.parseInt("abc"))
Importante: Exceções não são erros de compilação (por exemplo, erros de digitação no código), mas problemas que surgem durante a execução do programa.
Por que exceções são boas?
- Código limpo: A lógica principal do programa não fica poluída com verificações para cada detalhe.
- Flexibilidade: É possível tratar erros de forma centralizada (por exemplo, todas as falhas de leitura de arquivos — em um único lugar).
- Confiabilidade: O programa não “cai” com uma mensagem enigmática, mas informa exatamente o que aconteceu.
2. Exceções (Exceptions) vs Erros (Errors)
Em Java, há dois tipos principais de problemas que podem ocorrer durante a execução do programa:
Erros (Errors)
Erros são problemas fatais e irrecuperáveis, decorrentes de falhas na própria máquina virtual Java (JVM). Geralmente estão ligados a recursos do computador ou a falhas internas da JVM.
Exemplos de erros:
- OutOfMemoryError — a memória acabou.
- StackOverflowError — estouro de pilha (por exemplo, devido a recursão infinita).
Importante: Normalmente não faz sentido tentar tratar esse tipo de erro no programa.
Exceções (Exceptions)
Exceções são problemas com os quais o programa pode (e deve) lidar. Elas surgem por erros na lógica do programa ou por fatores externos (por exemplo, o usuário forneceu um valor diferente do esperado).
Exemplos de exceções:
- NullPointerException — tentativa de usar null como um objeto.
- ArrayIndexOutOfBoundsException — acesso fora dos limites do array.
- IOException — erro ao trabalhar com arquivos.
Em Java, há dois tipos de exceção:
- Checked exceptions (verificadas) — o compilador exige que sejam tratadas (por exemplo, IOException).
- Unchecked exceptions (não verificadas) — o compilador não exige tratamento (por exemplo, NullPointerException).
Diagrama: onde cada coisa se encaixa
graph TD
Throwable --> Error
Throwable --> Exception
Exception --> RuntimeException
Exception --> Checked["(outras exceções)"]
style Throwable fill:#ffa64d,color:#000
style Exception fill:#ffa64d,color:#000
style Checked fill:#ffa64d,color:#000
style Error fill:#ff4d4d,color:#fff
style RuntimeException fill:#4dff88,color:#000
Explicação:
- Throwable — a raiz de toda a hierarquia de erros e exceções em Java.
- Error — erros fatais da JVM, não são tratados.
- Exception — exceções “normais”, que podem e devem ser tratadas.
- RuntimeException — exceções não verificadas (erros do programador).
3. Como isso aparece no código?
Exemplo 1: divisão por zero
public class ExceptionDemo
{
public static void main(String[] args)
{
int a = 10;
int b = 0;
int c = a / b; // ArithmeticException ocorrerá aqui!
System.out.println("Resultado: " + c);
}
}
O que vai acontecer?
O programa terminará com erro, e você verá a seguinte mensagem:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at ExceptionDemo.main(ExceptionDemo.java:5)
Exemplo 2: acesso a um elemento inexistente do array
int[] arr = {1, 2, 3};
System.out.println(arr[10]); // ArrayIndexOutOfBoundsException
Exemplo 3: trabalho com arquivos
import java.io.FileReader;
import java.io.IOException;
public class FileDemo
{
public static void main(String[] args) throws IOException
{
FileReader reader = new FileReader("nofile.txt"); // FileNotFoundException (checked)
int data = reader.read();
System.out.println(data);
reader.close();
}
}
E agora vamos ver como tratar essas situações excepcionais de forma elegante.
GO TO FULL VERSION