Java intercepte plusieurs exceptions

Dans ce tutoriel, nous allons apprendre à gérer plusieurs exceptions en Java à l'aide d'exemples.

Avant Java 7, nous devions écrire plusieurs codes de gestion des exceptions pour différents types d'exceptions, même s'il y avait une redondance de code.

Prenons un exemple.

Exemple 1: plusieurs blocs catch

 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()); ) ) ) 

Production

 / par zéro 

Dans cet exemple, deux exceptions peuvent se produire:

  • ArithmeticException parce que nous essayons de diviser un nombre par 0.
  • ArrayIndexOutOfBoundsException car nous avons déclaré un nouveau tableau d'entiers avec des limites de tableau de 0 à 9 et nous essayons d'attribuer une valeur à l'index 10.

Nous imprimons le message d'exception dans les deux catchblocs, c'est-à-dire le code en double.

L'associativité de l'opérateur d'affectation =est de droite à gauche, donc un ArithmeticExceptionest lancé en premier avec le message / par zéro.

Gérer plusieurs exceptions dans un bloc catch

Dans Java SE 7 et versions ultérieures, nous pouvons désormais intercepter plus d'un type d'exception dans un seul catchbloc.

Chaque type d'exception qui peut être géré par le catchbloc est séparé à l'aide d'une barre verticale ou d'un tuyau |.

Sa syntaxe est:

 try ( // code ) catch (ExceptionType1 | Exceptiontype2 ex) ( // catch block ) 

Exemple 2: bloc multi-captures

 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()); ) ) ) 

Production

 / par zéro 

La capture de plusieurs exceptions dans un seul catchbloc réduit la duplication de code et augmente l'efficacité.

Le bytecode généré lors de la compilation de ce programme sera plus petit que le programme ayant plusieurs catchblocs car il n'y a pas de redondance de code.

Remarque: Si un catchbloc gère plusieurs exceptions, le paramètre catch est implicitement final. Cela signifie que nous ne pouvons attribuer aucune valeur aux paramètres de capture.

Exception de base de capture

Lors de la capture de plusieurs exceptions dans un seul catchbloc, la règle est généralisée à spécialisée.

Cela signifie que s'il existe une hiérarchie d'exceptions dans le catchbloc, nous pouvons uniquement intercepter l'exception de base au lieu d'attraper plusieurs exceptions spécialisées.

Prenons un exemple.

Exemple 3: Capture de la classe d'exception de base uniquement

 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()); ) ) ) 

Production

 / par zéro 

Nous savons que toutes les classes d'exception sont des sous-classes de la Exceptionclasse. Ainsi, au lieu d'attraper plusieurs exceptions spécialisées, nous pouvons simplement attraper la Exceptionclasse.

Si la classe d'exception de base a déjà été spécifiée dans le catchbloc, n'utilisez pas de classes d'exception enfants dans le même catchbloc. Sinon, nous obtiendrons une erreur de compilation.

Prenons un exemple.

Exemple 4: Capture des classes d'exception de base et enfants

 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()); ) ) ) 

Production

 Main.java:6: erreur: les alternatives dans une instruction multi-catch ne peuvent pas être liées par sous-classification 

Dans cet exemple, ArithmeticExceptionet ArrayIndexOutOfBoundsExceptionsont les deux sous-classes de la Exceptionclasse. Donc, nous obtenons une erreur de compilation.

Articles intéressants...