Dominando el manejo multi‑excepción en Java
Dominando el manejo multi‑excepción en Java
Descubre cómo atrapar varias excepciones con un solo bloque catch, simplifica tu código y evita trampas comunes.
Antes de Java 7, los desarrolladores tenían que escribir bloques catch separados para cada tipo de excepción, incluso cuando la lógica de manejo era idéntica.
Considera el siguiente escenario.
Ejemplo 1: Bloques catch separados
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
/ by zero
En este ejemplo surgen dos problemas distintos:
ArithmeticException– división por cero.ArrayIndexOutOfBoundsException– accediendo índice 10 en array de 10 elementos.
Ambos bloques catch realizan la misma acción, llevando a código duplicado.
Atrapando múltiples excepciones en un solo bloque
Desde Java SE 7, puedes combinar varios tipos de excepción en un bloque catch usando el separador pipe (|).
Sintaxis:
try { // código } catch (TipoExcepcion1 | TipoExcepcion2 ex) { // manejador }
Ejemplo 2: Bloque multi‑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()); } } }
Salida
/ by zero
Al fusionar los manejadores, el código es más limpio, el bytecode más pequeño y el mantenimiento más fácil.
Nota: En un multi‑catch, el parámetro es implícitamente final, así que no puedes reasignarlo.
Usando una clase base de excepción
Si varias excepciones atrapadas comparten un ancestro común, puedes atrapar ese ancestro en lugar de listar cada subclase.
Ejemplo 3: Atrapando la clase base Exception
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
/ by zero
Como cada excepción específica en Java extiende Exception, este único bloque catch maneja todos los escenarios anteriores.
Si una excepción base ya es atrapada, incluir sus subclases en el mismo catch disparará un error de compilación.
Ejemplo 4: Combinación inválida de excepciones base e hijas
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: Alternatives in a multi-catch statement cannot be related by subclassing
Este error ocurre porque ArithmeticException y ArrayIndexOutOfBoundsException son subclases de Exception, violando la regla del lenguaje.
Java
- Dominar Operadores en Java: Tipos, Sintaxis y Ejemplos Prácticos
- Comentarios en Java: Tipos, Uso y Mejores Prácticas
- Dominar el Bucle for Mejorado en Java: Sintaxis, Ejemplos y Mejores Prácticas
- Dominar Strings en Java: Creación, Métodos y Mejores Prácticas
- Dominando interfaces en Java: Conceptos, implementación y mejores prácticas
- Dominando las clases internas anónimas en Java: Definición, sintaxis y ejemplos prácticos
- Dominando el manejo de excepciones en Java: Try, Catch, Finally y Recursos
- Java throw vs throws: Dominando el manejo de excepciones con ejemplos prácticos
- Dominando Try‑with‑Resources en Java: Gestión automática de recursos explicada
- Anotaciones en Java explicadas: Tipos, ubicación y ejemplos prácticos
- Aserciones en Java: Guía práctica para detectar bugs y asegurar fiabilidad del código