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