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.
Pongamos un ejemplo.
Ejemplo 1: múltiples bloques de captura
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
/ por cero
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 entera 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 en ambos
catch
bloques, es decir, código duplicado.
La asociatividad del operador de asignación
=
es de derecha a izquierda, por lo que ArithmeticException
se arroja primero con el mensaje/ por cero.Manejar múltiples excepciones en un bloque catch
En Java SE 7 y versiones posteriores, ahora podemos detectar más de un tipo de excepción en un solo
catch
bloque.
Cada tipo de excepción que puede manejar el
catch
bloque se separa mediante una barra o tubería vertical |
.
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
/ por cero
Capturar múltiples excepciones en un solo
catch
bloque reduce la duplicación de código y aumenta la eficiencia.
El
catch
código de bytes generado al compilar este programa será más pequeño que el programa que tiene múltiples bloques ya que no hay redundancia de código.
Nota: Si un
catch
bloque maneja múltiples excepciones, el parámetro catch es implícitamente final
. Esto significa que no podemos asignar ningún valor para capturar parámetros.Captura de la excepción base
Al detectar varias excepciones en un solo
catch
bloque, 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 detectar varias excepciones especializadas.
Pongamos un ejemplo.
Ejemplo 3: solo clase de excepción base de captura
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
/ por cero
Sabemos que todas las clases de excepción son subclases de la
Exception
clase. Entonces, en lugar de detectar múltiples excepciones especializadas, simplemente podemos capturar la 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
bloque. De lo contrario, obtendremos un error de compilación.
Pongamos 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: las alternativas en una declaración de captura múltiple no pueden relacionarse mediante subclases
En este ejemplo,
ArithmeticException
y ArrayIndexOutOfBoundsException
son ambas subclases de la Exception
clase. Entonces, tenemos un error de compilación.
0 Comentarios
Dejanos tu comentario para seguir mejorando!