Java captura múltiplas exceções
Java captura várias exceções
Neste tutorial, aprenderemos a lidar com várias exceções em Java com a ajuda de exemplos.
Antes do Java 7, tínhamos que escrever vários códigos de manipulação de exceção para diferentes tipos de exceção, mesmo que houvesse redundância de código.
Vamos dar um exemplo.
Exemplo 1:vários blocos catch
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, duas exceções podem ocorrer:
ArithmeticExceptionporque estamos tentando dividir um número por 0.ArrayIndexOutOfBoundsExceptionporque declaramos um novo array inteiro com limites de array de 0 a 9 e estamos tentando atribuir um valor ao índice 10.
Estamos imprimindo a mensagem de exceção no
catch blocos, ou seja, código duplicado. A associatividade do operador de atribuição
= é da direita para a esquerda, então um ArithmeticException é lançado primeiro com a mensagem
/ by zero
. Lidar com várias exceções em um bloco catch
No Java SE 7 e posterior, agora podemos capturar mais de um tipo de exceção em um único
catch quadra. Cada tipo de exceção que pode ser tratado pelo
catch bloco é separado usando uma barra vertical ou barra vertical | . Sua sintaxe é:
try {
// code
} catch (ExceptionType1 | Exceptiontype2 ex) {
// catch block
}
Exemplo 2:bloco de captura múltipla
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
Capturando várias exceções em um único
catch block reduz a duplicação de código e aumenta a eficiência. O bytecode gerado durante a compilação deste programa será menor do que o programa com vários
catch blocos, pois não há redundância de código. Observação: Se um
catch bloco trata várias exceções, o parâmetro catch é implicitamente final . Isso significa que não podemos atribuir nenhum valor aos parâmetros de captura. Capturando a exceção base
Ao capturar várias exceções em um único
catch bloco, a regra é generalizada para especializada. Isso significa que, se houver uma hierarquia de exceções no
catch bloco, podemos capturar a exceção base apenas em vez de capturar várias exceções especializadas. Vamos dar um exemplo.
Exemplo 3:capturando apenas a classe de exceção base
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
Sabemos que todas as classes de exceção são subclasses do
Exception classe. Portanto, em vez de capturar várias exceções especializadas, podemos simplesmente capturar o Exception classe. Se a classe de exceção base já foi especificada no
catch bloco, não use classes de exceção filhas no mesmo catch quadra. Caso contrário, teremos um erro de compilação. Vamos dar um exemplo.
Exemplo 4:capturando classes de exceção base e filha
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
Neste exemplo,
ArithmeticException e ArrayIndexOutOfBoundsException são ambas subclasses do Exception classe. Assim, obtemos um erro de compilação. Java