English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriales básicos de Java

Control de flujo de Java

Java Arreglo

Java Orientado a Objetos (I)

Java Orientado a Objetos (II)

Java Orientado a Objetos (III)

Manejo de excepciones en Java

Java Lista (List)

Java Queue (Cola)

Java Map Colección

Java Set Colección

Java Entrada/Salida (I/O)

Reader de Java/Writer

Temas adicionales de Java

Java captura y maneja múltiples excepciones

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.

ejemplo1:多个捕获块

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.

Manejar múltiples excepciones en el bloque catch

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
}

ejemplo2:单个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.

ejemplo3:仅捕获基本异常类

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.

ejemplo4captura de clase base de excepciones y subclases

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.