English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En este tutorial, aprenderemos a manejar múltiples excepciones en Java con ejemplos.
En Java 7Antes, incluso si existía código redundante, debíamos escribir múltiples códigos de manejo de excepciones para diferentes tipos de excepciones.
Vamos a dar un ejemplo.
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()); } } }
resultado de salida
/ por zero
En este ejemplo pueden ocurrir dos excepciones:
ArithmeticException - porque intentamos dividir un número por cero.
ArrayIndexOutOfBoundsException - porque ya hemos declarado un nuevo array de enteros, con límites de 0 a9y intentamos asignar el índice10asignar un valor.
Imprimimos el mensaje de excepción en ambos bloques catch, lo que es código repetido.
La asociatividad del operador de asignación (=) es de derecha a izquierda, por lo tanto, primero se asigna ArithmeticException con el mensaje / por zero lanza.
En Java SE 7y versiones posteriores, ahora podemos capturar varios tipos de excepciones en un solo bloque catch.
Cada tipo de excepción que puede manejar el bloque catch se separa por una barra vertical (|).
Su sintaxis es:
try { // código } catch (tipoDeExcepción1 | tipoDeExcepción2 ex) { // bloque catch }
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()); } } }
resultado de salida
/ por zero
Capturar múltiples excepciones en un solo bloque catch puede reducir la repetición de código y aumentar la eficiencia.
El código bytecode generado al compilar este programa será más pequeño que el programa con múltiples bloques catch, ya que no hay código redundante.
Nota:Si un bloque catch maneja múltiples excepciones, el parámetro catch es implícitamente final. Esto significa que no podemos asignar ningún valor para capturar el parámetro.
Cuando se capturan múltiples excepciones en un solo bloque catch, esta regla se generaliza a la regla de especialización.
Esto significa que, si existe una jerarquía de excepciones en el bloque catch, solo podemos capturar la excepción básica y no múltiples excepciones específicas.
Vamos a dar un ejemplo.
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()); } } }
resultado de salida
/ por zero
Sabemos que todas las clases de excepciones son subclases de la clase Exception. Por lo tanto, no es necesario capturar múltiples excepciones específicas, sino solo capturar la clase Exception.
Si ya se ha especificado la clase de excepción básica en el bloque catch, no utilice las subexcepciones en el mismo bloque catch. De lo contrario, obtendremos un error de compilación.
Vamos a dar un ejemplo.
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()); } } }
resultado de salida
Main.java:6: error: Alternativas en un-la declaración catch no puede estar relacionada por subclase
En este ejemplo, ArithmeticException y ArrayIndexOutOfBoundsException son subclases de Exception. Por lo tanto, lanzamos un error de compilación.