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 catch
blocs, c'est-à-dire le code en double.
L'associativité de l'opérateur d'affectation =
est de droite à gauche, donc un ArithmeticException
est 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 catch
bloc.
Chaque type d'exception qui peut être géré par le catch
bloc 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 catch
bloc 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 catch
blocs car il n'y a pas de redondance de code.
Remarque: Si un catch
bloc 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 catch
bloc, la règle est généralisée à spécialisée.
Cela signifie que s'il existe une hiérarchie d'exceptions dans le catch
bloc, 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 Exception
classe. Ainsi, au lieu d'attraper plusieurs exceptions spécialisées, nous pouvons simplement attraper la Exception
classe.
Si la classe d'exception de base a déjà été spécifiée dans le catch
bloc, n'utilisez pas de classes d'exception enfants dans le même catch
bloc. 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, ArithmeticException
et ArrayIndexOutOfBoundsException
sont les deux sous-classes de la Exception
classe. Donc, nous obtenons une erreur de compilation.