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:
ArithmeticException
porque estamos tentando dividir um número por 0.ArrayIndexOutOfBoundsException
porque 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