English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Neste tutorial, vamos aprender, com exemplos, como lidar com múltiplas exceções no Java.
em Java 7Antes disso, mesmo que houvesse código redundante, tínhamos que escrever vários códigos de tratamento de exceções para diferentes tipos de exceções.
Vamos dar um exemplo.
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 de Dados
/ por zero
Neste exemplo podem ocorrer duas exceções:
ArithmeticException - porque tentamos dividir um número por zero.
ArrayIndexOutOfBoundsException - porque já declaramos um novo array de inteiros, o limite do array é de 0 a9e tentamos atribuir para o índice10atribuir um valor.
Nós imprimimos a mensagem de exceção em dois blocos catch, ou seja, código repetido.
A associação do operador de atribuição (=) é da direita para a esquerda, portanto, primeiro ArithmeticException com a mensagem / por zero começou a lançar.
No Java SE 7e versões mais recentes, agora podemos capturar vários tipos de exceções em um único bloco catch.
Cada tipo de exceção que pode ser tratada pelo bloco catch é separado por um pipe (|).
Sua sintaxe é:
try { // código } catch (TipoDeExceção1 | tipoDeExceção2 ex) { // bloco 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 de Dados
/ por zero
Capturar várias exceções em um único bloco catch pode reduzir a repetição de código e aumentar a eficiência.
O código byte gerado ao compilar o programa será menor do que o programa com vários blocos catch, pois não há código redundante.
Atenção:Se um bloco catch lidar com várias exceções, o parâmetro catch é implicitamente final. Isso significa que não podemos atribuir qualquer valor para capturar o parâmetro.
Quando capturamos várias exceções em um único bloco catch, essa regra se generaliza para a regra especializada.
Isso significa que, se houver uma hierarquia de exceções no bloco catch, podemos capturar apenas a exceção básica e não várias exceções especializadas.
Vamos dar um exemplo.
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 de Dados
/ por zero
Sabemos que todas as classes de exceção são subclasses da classe Exception. Portanto, não precisamos capturar várias exceções especializadas, mas apenas a classe Exception.
Se já especificou a classe básica de exceção no bloco catch, não use subclasses de exceção no mesmo bloco catch. Caso contrário, teremos um erro de compilação.
Vamos dar um exemplo.
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 de Dados
Main.java:6: erro: Alternativas em um multi-A declaração catch não pode ser relacionada por subclassing
Neste exemplo, ArithmeticException e ArrayIndexOutOfBoundsException são subclasses da classe Exception. Portanto, lançamos um erro de compilação.