English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Dans ce tutoriel, nous allons apprendre comment gérer plusieurs exceptions en Java à l'aide d'exemples.
En Java 7Avant cela, même s'il y avait un redondance de code, nous devions écrire plusieurs codes de traitement d'exceptions pour différents types d'exceptions.
Laissons-nous prendre un exemple.
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()); } } }
Output result
/ by zero
Dans cet exemple, deux exceptions peuvent se produire :
ArithmeticException - Parce que nous essayons de diviser un nombre par zéro.
ArrayIndexOutOfBoundsException - Parce que nous avons déclaré un nouveau tableau d'entiers, les limites de l'array sont de 0 à9Et nous essayons d'attribuer l'index10Assigner une valeur.
Nous imprimons les messages d'exception dans les deux blocs catch, ce qui est un code redondant.
L'associativité de l'opérateur d'affectation (=) est de droite à gauche, donc d'abord ArithmeticException avec le message / by zero est lancé.
Dans Java SE 7Et les versions plus élevées, nous pouvons maintenant capturer plusieurs types d'exceptions dans un seul bloc catch.
Chaque type d'exception que le bloc catch peut traiter est séparé par un tiret vertical (|).
Sa syntaxe est :
try { // code } catch (ExceptionType1 | Exceptiontype2 ex) { // bloc 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()); } } }
Output result
/ by zero
Capturer plusieurs exceptions dans un seul bloc catch peut réduire la répétition du code et améliorer l'efficacité.
Le bytecode généré lors de la compilation de ce programme sera plus petit que celui d'un programme avec plusieurs blocs catch, car il n'y a pas de redondance de code.
Attention :Si un bloc catch traite plusieurs exceptions, le paramètre catch est implicitement final. Cela signifie que nous ne pouvons assigner aucune valeur pour capturer le paramètre.
Lorsque plusieurs exceptions sont capturées dans un seul bloc catch, cette règle est généralisée en règle spécialisée.
Cela signifie que si il existe une hiérarchie d'exceptions dans un bloc catch, nous ne pouvons capturer que les exceptions de base et non plusieurs exceptions spécifiques.
Laissons-nous prendre un exemple.
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()); } } }
Output result
/ by zero
Nous savons que toutes les classes d'exception sont des sous-classes de la classe Exception. Par conséquent, nous n'avons pas besoin de capturer plusieurs exceptions spécifiques, mais simplement de capturer la classe Exception.
Si vous avez déjà spécifié une classe d'exception de base dans un bloc catch, n'utilisez pas de sous-classes d'exceptions dans le même bloc catch. Sinon, nous obtenons une erreur de compilation.
Laissons-nous prendre un exemple.
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()); } } }
Output result
Main.java:6: error: Alternatives in a multi-catch statement cannot be related by subclassing
In this example, ArithmeticException and ArrayIndexOutOfBoundsException are subclasses of the Exception class. Therefore, we throw a compilation error.