Archives Wild Code School
Java Avancé

La gestion des exceptions

Quête 11 sur 15

Dans cette quête, tu vas découvrir comment gérer les erreurs qui peuvent arriver durant l'exécution de ton programme java.

Les exceptions représentent le mécanisme de gestion des erreurs qui apparaissent durant l'exécution d'un programme Java.

Lors de la détection d'une erreur, un objet qui hérite de la classe Exception est créé (on dit qu'une exception est levée) et propagé à travers la pile d'exécution jusqu'à ce qu'il soit traité.

Ces mécanismes permettent de renforcer la robustesse du code Java.

Objectifs

  • Comprendre ce qu'est une exception
  • Savoir gérer les exceptions

Try et Catch

Pour illustrer le rôle de la gestion des exception, prends l'exemple de la division par zéro, qui est mathématiquement impossible.

Lis ce code et exécute-le :

java
public class WildException {
    public static void main(String[] args) {
        int i = 3;
        int j = 0;
        System.out.println("résultat = " + (i / j));
        System.out.println("Fin!");
    }
}

Dans cet exemple, le code tente de diviser le nombre 3 par zéro, ce qui est interdit.

Cela provoque donc une exception de type ArithmeticException, qui est une classe fille de la classe générale Exception, qui est levée automatiquement pour toute erreur arithmétique.

1. Resultat

Comme tu peux le constater, tu as eu une exception et ton programme s'est arrêté brutalement. Tu peux gérer cette exception de l'une des façons suivantes :

  1. Essayer de la récupérer avec try/catch

  2. Ajouter le mot clé throws dans la déclaration du bloc

2. Les mots clés try, catch

Regarde ce cours, il va t'apprendre tout ce dont tu as besoin sur les mots clés try et catch.

3. Explications et remarques

Si un événement indésirable survient dans le bloc try, la partie éventuellement non exécutée de ce bloc est abandonnée et le premier bloc catch est traité.

Si un bloc catch est défini pour capturer l'exception issue du bloc try, alors elle est traitée en exécutant le code associé au bloc.

Si le bloc catch est vide (aucune instruction entre les accolades) l'exception capturée est alors ignorée. Une telle utilisation de l'instruction try/catch n'est pas une bonne pratique : il est préférable de toujours apporter un traitement adapté lors de la capture d'une exception.

4. Exemple : Gestion de l'exception de division par zéro

On revient sur notre exemple et ajoute la gestion des exceptions :

java
public class WildException2 {

    public static void main(String[] args) {
        try {
            int i = 3;
            int j = 0;
            System.out.println("résultat = " + (i / j));
        } catch (ArithmeticException e) {
            System.err.println("Division par zero interdite !!");
        }
        System.out.println("Wilder tu as bien gérer l'exception et donc je continue l'execution");
        System.out.println("Fin!");

    }

}

S'il y a plusieurs types d'erreurs et d'exceptions à intercepter, il faut définir autant de blocs catch que de types d'événements. Par type d'exception, il faut comprendre « qui est du type de la classe de l'exception ou d'une de ses sous-classes ».

Ainsi dans l'ordre séquentiel des clauses catch, un type d'exception ne doit pas venir après un type d'une exception d'une super-classe. Il faut faire attention à l'ordre des clauses catch pour traiter en premier les exceptions les plus précises (sous-classes) avant les exceptions plus générales. Un message d'erreur est émis par le compilateur dans le cas contraire.

Pour illustrer l'importance de l'ordre des clauses catch, implémente ce bout de code :

java
public class WildException3 {
    public static void main(java.lang.String[] args) {
        int i = 3;
        int j = 0;
        try {
            System.out.println("résultat = " + (i / j));
        } catch (Exception e) {
        } catch (ArithmeticException e) {
        }
    }
}

Si tu utilises un IDE, tu auras une erreur de type unreachable catch block, qui te dit simplement que ce code ne sera jamais exécuté parce que ArithmeticException est une sous classe de la classe Exception. Sinon, tu auras une erreur de compilation qui te dit la même chose :

↗
La gestion des exceptions
jmdoudoux.fr

Finally

Imaginons que tu souhaites effectuer une action, qu'une exception soit levée ou non (Java Finally block - Exception handling). Java te permet d'utiliser une clause via le mot clé finally. Voyons ce que donne ce code :

java
public class WildException4 {

    public static void main(String[] args) {
        try {
            int i = 3;
            int j = 0;
            System.out.println("résultat = " + (i / j));
        } catch (ArithmeticException e) {
            System.err.println("Division par zero interdite !!");
        } finally {
            System.out.println("action faite systématiquement");
        }
    }
}

Le block du code à l'intérieur du finally sera exécuté dans tous les cas.

↗
Optionnel : Les exceptions chaînées
docs.oracle.com
↗
Optionnel : Les exceptions personnalisées
docs.oracle.com
↗
Optionnel : L'instruction throw
docs.oracle.com
↗
Optionnel : L'instruction try-with-resources
docs.oracle.com
↗
Java Finally block - Exception handling
beginnersbook.com
↗
Java Exceptions - Try...Catch
w3schools.com
↗
La gestion des exceptions
jmdoudoux.fr

Challenge

Somme des nombre impairs

Pour démarrer, fais un Fork du dépôt suivant puis clone-le en local.

Pense bien à faire un Fork, sinon tu ne pourras rien pousser !

bash
./tester.sh OddSum

Critères de validation

  • Le code est propre et contient le try et catch.

  • Le test s'exécute sans erreur et tous les tests sont OK.

  • Utiliser le type d'exception adéquat.