Java captura múltiples excepciones
Java captura múltiples excepciones
En este tutorial, aprenderemos a manejar múltiples excepciones en Java con la ayuda de ejemplos.
Antes de Java 7, teníamos que escribir múltiples códigos de manejo de excepciones para diferentes tipos de excepciones, incluso si había redundancia de código.
Tomemos un ejemplo.
Ejemplo 1:Múltiples bloques 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());
}
}
}
Salida
/ by zero
En este ejemplo, pueden ocurrir dos excepciones:
ArithmeticExceptionporque estamos tratando de dividir un número por 0.ArrayIndexOutOfBoundsExceptionporque hemos declarado una nueva matriz de enteros con límites de matriz de 0 a 9 y estamos tratando de asignar un valor al índice 10.
Estamos imprimiendo el mensaje de excepción tanto en el catch bloques, es decir, código duplicado.
La asociatividad del operador de asignación = es de derecha a izquierda, por lo que un ArithmeticException se lanza primero con el mensaje
/ por cero
.
Manejar múltiples excepciones en un bloque catch
En Java SE 7 y versiones posteriores, ahora podemos capturar más de un tipo de excepción en un solo catch bloquear.
Cada tipo de excepción que puede manejar el catch el bloque se separa usando una barra vertical o tubería | .
Su sintaxis es:
try {
// code
} catch (ExceptionType1 | Exceptiontype2 ex) {
// catch block
}
Ejemplo 2:bloque de captura múltiple
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());
}
}
}
Salida
/ by zero
Captura de múltiples excepciones en un solo catch block reduce la duplicación de código y aumenta la eficiencia.
El código de bytes generado al compilar este programa será más pequeño que el programa que tiene múltiples catch bloques ya que no hay redundancia de código.
catch bloque maneja múltiples excepciones, el parámetro catch es implícitamente final . Esto significa que no podemos asignar ningún valor a los parámetros de captura.
Excepción base de captura
Al capturar múltiples excepciones en un solo catch block, la regla se generaliza a especializada.
Esto significa que si hay una jerarquía de excepciones en el catch bloque, podemos capturar la excepción base solo en lugar de capturar múltiples excepciones especializadas.
Tomemos un ejemplo.
Ejemplo 3:capturar solo la clase de excepción 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());
}
}
}
Salida
/ by zero
Sabemos que todas las clases de excepción son subclases del Exception clase. Entonces, en lugar de capturar múltiples excepciones especializadas, simplemente podemos capturar el Exception clase.
Si la clase de excepción base ya se ha especificado en el catch bloque, no use clases de excepción secundarias en el mismo catch bloquear. De lo contrario, obtendremos un error de compilación.
Tomemos un ejemplo.
Ejemplo 4:captura de clases de excepción base y secundaria
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());
}
}
}
Salida
Main.java:6: error: Alternatives in a multi-catch statement cannot be related by subclassing
En este ejemplo, ArithmeticException y ArrayIndexOutOfBoundsException son ambas subclases del Exception clase. Entonces, obtenemos un error de compilación.
Java