🧠 Tópico: Use catch, multi-catch e finally clauses

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 do catch.

🚫 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

  1. C – O catch genérico primeiro impede a compilação.
  2. B – Essas exceções não têm relação entre si, é válido.
  3. C – O bloco finally sempre executa.
  4. C – O finally roda mesmo sem exceções.
  5. D – Use multi-catch quando o tratamento for igual.


Deixe um comentário