English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriel de base Java

Contrôle de flux Java

Java tableau

Java orienté objet (I)

Java orienté objet (II)

Java orienté objet (III)

Gestion des exceptions Java

Java Liste (List)

Java Queue (file d'attente)

Java Map collectif

Java Set collectif

Java entrée/sortie (I/O)

Java Reader/Writer

Autres sujets Java

Java attrape et traite plusieurs exceptions

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.

Example1:Plusieurs blocs de capture

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é.

Traiter plusieurs exceptions dans un bloc catch

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
}

Example2:Capturer plusieurs exceptions dans un seul 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.

Capturer les exceptions de base

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.

Example3:Seulement capturer les exceptions de base

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.

Example4: Catch base class and subclass exceptions

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.