Maîtriser la gestion multi-exceptions en Java
Maîtriser la gestion multi-exceptions en Java
Découvrez comment attraper plusieurs exceptions avec un seul bloc catch, rationaliser votre code et éviter les pièges courants.
Avant Java 7, les développeurs devaient écrire des blocs catch séparés pour chaque type d'exception, même quand la logique de gestion était identique.
Considérez le scénario suivant.
Exemple 1 : Blocs catch séparés
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()); } } }
Sortie
/ by zero
Dans cet exemple, deux problèmes distincts peuvent survenir :
ArithmeticException– division par zéro.ArrayIndexOutOfBoundsException– accès à l'index 10 dans un tableau de 10 éléments.
Les deux blocs catch effectuent la même action, menant à du code dupliqué.
Attraper plusieurs exceptions dans un seul bloc
Depuis Java SE 7, vous pouvez combiner plusieurs types d'exceptions en un seul bloc catch en utilisant le séparateur pipe (|).
Syntaxe :
try { // code } catch (ExceptionType1 | ExceptionType2 ex) { // gestionnaire }
Exemple 2 : Bloc 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()); } } }
Sortie
/ by zero
En fusionnant les gestionnaires, le code est plus propre, le bytecode plus petit, et la maintenance plus facile.
Note : Dans un multi-catch, le paramètre est implicitement final, donc vous ne pouvez pas le réassigner.
Utilisation d'une classe d'exception de base
Si plusieurs exceptions attrapées partagent un ancêtre commun, vous pouvez attraper cet ancêtre au lieu de lister chaque sous-classe.
Exemple 3 : Attraper la classe de 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()); } } }
Sortie
/ by zero
Puisque chaque exception spécifique en Java étend Exception, ce bloc catch unique gère tous les scénarios ci-dessus.
Si une exception de base est déjà attrapée, inclure ses sous-classes dans le même catch déclenchera une erreur de compilation.
Exemple 4 : Combinaison invalide d'exceptions de base et filles
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()); } } }
Sortie
Main.java:6: error: Alternatives in a multi-catch statement cannot be related by subclassing
Cette erreur survient parce que ArithmeticException et ArrayIndexOutOfBoundsException sont des sous-classes de Exception, violant la règle du langage.
Java
- Maîtriser les opérateurs Java : Types, syntaxe et exemples pratiques
- Commentaires Java : Types, utilisation et bonnes pratiques
- Maîtriser la boucle for améliorée en Java : Syntaxe, exemples et bonnes pratiques
- Maîtriser les chaînes de caractères en Java : Création, méthodes et bonnes pratiques
- Maîtriser les interfaces Java : concepts, implémentation et bonnes pratiques
- Maîtriser les classes internes anonymes en Java : définition, syntaxe et exemples pratiques
- Maîtriser la gestion d'exceptions Java : try, catch, finally et ressources
- Java throw vs throws : maîtriser la gestion d'exceptions avec exemples pratiques
- Maîtriser le try-with-resources Java : gestion automatique des ressources expliquée