Java intercepte plusieurs exceptions
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 en cas de 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());
}
}
}
Sortie
/ by zero
Dans cet exemple, deux exceptions peuvent se produire :
ArithmeticException
car nous essayons de diviser un nombre par 0.ArrayIndexOutOfBoundsException
car nous avons déclaré un nouveau tableau d'entiers avec des bornes de tableau de 0 à 9 et nous essayons d'attribuer une valeur à l'index 10.
Nous imprimons le message d'exception à la fois dans le catch
blocs, c'est-à-dire 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
bloquer.
Chaque type d'exception pouvant être géré par le catch
le 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-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
Attraper plusieurs exceptions dans un seul catch
block 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 catch.
Attraper l'exception de base
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 intercepter l'exception de base uniquement au lieu d'intercepter 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());
}
}
}
Sortie
/ by zero
Nous savons que toutes les classes d'exception sont des sous-classes du Exception
classer. Ainsi, au lieu d'attraper plusieurs exceptions spécialisées, nous pouvons simplement attraper le 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
bloquer. Sinon, nous aurons une erreur de compilation.
Prenons un exemple.
Exemple 4 :Attraper les classes de base et les classes d'exception 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());
}
}
}
Sortie
Main.java:6: error: Alternatives in a multi-catch statement cannot be related by subclassing
Dans cet exemple, ArithmeticException
et ArrayIndexOutOfBoundsException
sont les deux sous-classes du Exception
classer. Donc, nous obtenons une erreur de compilation.
Java