En este tutorial, aprenderemos a manejar múltiples excepciones en Java con la ayuda de ejemplos.
Antes de Java 7, teníamos que escribir varios códigos de manejo de excepciones para diferentes tipos de excepciones, incluso si había redundancia de código.
Pongamos un ejemplo.
Ejemplo 1: varios 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 entre 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 en ambos catch
bloques, es decir, código duplicado.
La asociatividad del operador de asignación =
es de derecha a izquierda, por lo que an ArithmeticException
se lanza primero con el mensaje / por cero.
Manejar múltiples excepciones en un bloque de captura
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
La captura de 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 varios 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 a los parámetros de captura.
Captura de excepción base
Al detectar múltiples 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 capturar múltiples excepciones especializadas.
Pongamos un ejemplo.
Ejemplo 3: captura de clase de excepción base solamente
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 capturar 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 secundarias
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 se pueden relacionar mediante subclases
En este ejemplo, ArithmeticException
y ArrayIndexOutOfBoundsException
son ambas subclases de la Exception
clase. Entonces, obtenemos un error de compilación.