Dominando Tratamento Multi-Exceção em Java
Dominando Tratamento Multi-Exceção em Java
Descubra como capturar várias exceções com um único bloco catch, simplifique seu código e evite armadilhas comuns.
Antes do Java 7, desenvolvedores tinham que escrever blocos catch separados para cada tipo de exceção, mesmo quando a lógica de tratamento era idêntica.
Considere o seguinte cenário.
Exemplo 1: Blocos catch separados
class Main { public static void main(String[] args) { try { int[] array = new int[10]; array[10] = 30 / 0; } catch (ArithmeticException e) { System.out.println(e.getMessage()); } catch (ArrayIndexOutOfBoundsException e) { System.out.println(e.getMessage()); } } }
Saída
/ by zero
Neste exemplo dois problemas distintos podem surgir:
ArithmeticException— divisão por zero.ArrayIndexOutOfBoundsException— acessando índice 10 em array de 10 elementos.
Ambos blocos catch realizam a mesma ação, levando a código duplicado.
Capturando Múltiplas Exceções em Bloco Único
Desde Java SE 7, você pode combinar vários tipos de exceção em um bloco catch usando o separador pipe (|).
Sintaxe:
try { // código } catch (TipoExcecao1 | TipoExcecao2 ex) { // manipulador }
Exemplo 2: Bloco multi-catch
class Main { public static void main(String[] args) { try { int[] array = new int[10]; array[10] = 30 / 0; } catch (ArithmeticException | ArrayIndexOutOfBoundsException e) { System.out.println(e.getMessage()); } } }
Saída
/ by zero
Mesclando os manipuladores, o código fica mais limpo, o bytecode menor e a manutenção mais fácil.
Nota: Em multi-catch, o parâmetro é implicitamente final, então você não pode reatribuí-lo.
Usando Classe Base de Exceção
Se várias exceções capturadas compartilham ancestral comum, você pode capturar o ancestral em vez de listar cada subclasse.
Exemplo 3: Capturando a classe base Exception
class Main { public static void main(String[] args) { try { int[] array = new int[10]; array[10] = 30 / 0; } catch (Exception e) { System.out.println(e.getMessage()); } } }
Saída
/ by zero
Como toda exceção específica em Java estende Exception, este único bloco catch trata todos os cenários acima.
Se exceção base já é capturada, incluir suas subclasses no mesmo catch disparará erro de compilação.
Exemplo 4: Combinação inválida de exceção base e filhas
class Main { public static void main(String[] args) { try { int[] array = new int[10]; array[10] = 30 / 0; } catch (Exception | ArithmeticException | ArrayIndexOutOfBoundsException e) { System.out.println(e.getMessage()); } } }
Saída
Main.java:6: error: Alternatives in a multi-catch statement cannot be related by subclassing
Este erro ocorre porque ArithmeticException e ArrayIndexOutOfBoundsException são subclasses de Exception, violando a regra da linguagem.
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
- Java throw vs throws: Dominando Tratamento de Exceções com Exemplos Práticos
- Dominando Try-With-Resources em Java: Gerenciamento Automático de Recursos Explicado
- Anotações em Java Explicadas: Tipos, Posicionamento e Exemplos Práticos