Esse tópico expande o tratamento de exceções, focando nos blocos de captura múltiplos, na ordem correta, e no uso do finally para garantir execução.
✅ 1. catch simples
Captura uma exceção específica:
try {
int x = 10 / 0;
} catch (ArithmeticException e) {
System.out.println("Divisão por zero");
}
✅ 2. multi-catch (Java 7+)
Permite capturar várias exceções com o mesmo tratamento:
try {
Files.readAllBytes(Paths.get("arquivo.txt"));
} catch (IOException | SecurityException e) {
System.out.println("Problema ao ler arquivo");
}
📌 Regras do multi-catch:
- Exceções não podem ter relação de herança entre si.
- A variável
eé final implicitamente → não pode ser reatribuída dentro docatch.
🚫 Exemplo que NÃO compila (herança):
try {
// ...
} catch (IOException | Exception e) {
// ❌ IOException herda de Exception
}
✅ 3. Múltiplos catch (ordem importa!)
Se as exceções forem diferentes e com tratamento próprio:
try {
// ...
} catch (FileNotFoundException e) {
System.out.println("Arquivo não encontrado");
} catch (IOException e) {
System.out.println("Erro de IO");
}
📌 A exceção mais específica (subclasse) deve vir antes da mais genérica.
✅ 4. finally
Sempre executa, com ou sem exceção:
try {
int[] nums = {1, 2, 3};
System.out.println(nums[5]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Índice inválido");
} finally {
System.out.println("Sempre executa");
}
Mesmo se houver return, continue ou break, o finally será executado.
❗ Cuidado com System.exit(0) – nesse caso, o finally não executa.
🧪 Quiz – 5 questões rápidas
1. O que acontece se você colocar catch(Exception e) antes de catch(ArithmeticException e)?
A) Compila normalmente
B) Dá erro em tempo de execução
C) Não compila
D) Ignora o segundo catch
2. Qual dessas combinações é válida em multi-catch?
A) IOException | Exception
B) IOException | SQLException
C) RuntimeException | Exception
D) NullPointerException | Throwable
3. O que é executado sempre, independentemente da exceção?
A) catch
B) try
C) finally
D) throw
4. O que acontece se nenhuma exceção for lançada e houver um bloco finally?
A) Ele não é executado
B) Ele só executa se houver catch
C) Ele sempre executa
D) Gera exceção
5. Qual dessas afirmações é verdadeira sobre multi-catch?
A) Pode lançar exceções com herança
B) A variável do catch pode ser reatribuída
C) Compila mesmo com tipos relacionados
D) É usado quando o tratamento é o mesmo
✅ Gabarito Comentado
- C – O
catchgenérico primeiro impede a compilação. - B – Essas exceções não têm relação entre si, é válido.
- C – O bloco
finallysempre executa. - C – O
finallyroda mesmo sem exceções. - D – Use
multi-catchquando o tratamento for igual.