Java captura varias 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 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 catchbloques, es decir, código duplicado.

La asociatividad del operador de asignación =es de derecha a izquierda, por lo que an ArithmeticExceptionse 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 catchbloque.

Cada tipo de excepción que puede manejar el catchbloque 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 catchbloque reduce la duplicación de código y aumenta la eficiencia.

El catchcó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 catchbloque 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 catchbloque, la regla se generaliza a especializada.

Esto significa que si hay una jerarquía de excepciones en el catchbloque, 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 Exceptionclase. Entonces, en lugar de capturar múltiples excepciones especializadas, simplemente podemos capturar la Exceptionclase.

Si la clase de excepción base ya se ha especificado en el catchbloque, no use clases de excepción secundarias en el mismo catchbloque. 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, ArithmeticExceptiony ArrayIndexOutOfBoundsExceptionson ambas subclases de la Exceptionclase. Entonces, obtenemos un error de compilación.

Articulos interesantes...