1. java-hell.de
  2. Thèmes
  3. Exceptions
Thème 9 sur 11

Apprendre les exceptions en Java – try, catch, finally

Les programmes plantent ; la seule question est de savoir si tu es prêt. Tu apprends à capturer les exceptions avec try et catch, à traiter différents types d'erreurs et à faire le ménage avec finally.

Les exercices

Ce que tu vas apprendre dans ce thème

  1. Le programme plante
  2. Pas un nombre valide
  3. Gérer deux exceptions
  4. finally : toujours à la fin
Exercice 1 sur 4

Le programme plante

Parfois, il se passe dans ton code des choses que Java ne sait tout simplement pas gérer, par exemple une division par zéro.

Java lance alors une exception et ton programme plante.

Attrape l'exception avec try { ... } catch (ArithmeticException e) { ... } et affiche plutôt Pas par zéro !.

Code de départ
void main() {
    int x = 10 / 0;
    IO.println(x);
}
Contexte
C'est quoi, une exception ?

Une exception est un objet que Java crée quand quelque chose tourne mal. Exemples : division par 0 (ArithmeticException), accès à null (NullPointerException), un indice de tableau trop grand (ArrayIndexOutOfBoundsException).

Sans try/catch, l'exception remonte à travers les méthodes appelantes. Si personne ne l'attrape, le programme meurt, avec une stack trace dans le terminal.

Avec try/catch, tu attrapes l'exception et tu peux y réagir, sans que ton programme plante.

Exercice 2 sur 4

Pas un nombre valide

Integer.parseInt("abc") lance une NumberFormatException : le texte n'est pas un nombre.

Attrape l'exception et affiche Pas un nombre ! au lieu de la valeur.

Code de départ
void main() {
    int nombre = Integer.parseInt("abc");
    IO.println(nombre);
}
Exercice 3 sur 4

Gérer deux exceptions

Un bloc try peut avoir plusieurs blocs catch, un par type d'exception.

Le code dans l'éditeur accède à tab[5], mais le tableau n'a que 3 éléments : c'est une ArrayIndexOutOfBoundsException.

Entoure la ligne d'un try/catch et gère les deux cas :

  • ArrayIndexOutOfBoundsException → affiche Indice trop grand !
  • NullPointerException → affiche Null !
Code de départ
void main() {
    int[] tab = {10, 20, 30};
    IO.println(tab[5]);
}
Contexte
L'ordre des blocs catch

Java parcourt les blocs catch de haut en bas et prend le premier qui correspond. C'est pour ça que les exceptions plus spécifiques doivent venir avant les plus générales, sinon le bloc général attraperait tout (le compilateur refuse d'ailleurs le mauvais ordre avec une erreur « already been caught »).

Depuis Java 7, tu peux combiner plusieurs types d'exception dans un seul catch : catch (IOException | SQLException e).

Exercice 4 sur 4

finally : toujours à la fin

Le bloc finally s'exécute toujours, qu'une exception se soit produite ou non.

On s'en sert par exemple pour fermer proprement des fichiers ou des connexions.

Complète le code : après le catch, ajoute un bloc finally qui affiche Terminé.

La sortie doit être :

Oups !
Terminé.
Code de départ
void main() {
    try {
        int x = 10 / 0;
    } catch (ArithmeticException e) {
        IO.println("Oups !");
    }
}
Contexte
Quand finally s'exécute-t-il ?

Toujours. Que le bloc try se soit déroulé normalement, qu'une exception ait été lancée (attrapée ou non), ou qu'un return ait quitté le try/catch. Seules exceptions : System.exit() ou un crash de la JVM.

Depuis Java 7, il existe le try-with-resources : try (Scanner s = new Scanner(...)) ferme les ressources automatiquement, plus besoin de finally.

Assez lu. À toi de jouer.

Dans le tutoriel, tu écris le code toi-même, tu cliques sur Exécuter et tu vois tout de suite si ton programme marche. Sans JDK, sans IDE, sans prise de tête.

S'entraîner sur Exceptions dans le navigateur