Adloun

programmation Java (école d'ingénieur) · Chapitre 11 · Exercice de TD

Garder la cause

Exceptions · niveau 3 (difficile)

Énoncé

Un fichier de notes contient des lignes de la forme « nom;note ». Écrire une méthode String lire(String ligne) qui renvoie « nom a note », et lève une exception vérifiée FormatException (à écrire) si la ligne n'a pas deux champs, ou si la note n'est pas un nombre. Dans ce dernier cas, la NumberFormatException d'origine doit être conservée comme cause. Tester sur « Alice;12.5 », « Bruno;quinze » et « Chloé ».

Corrigé


class FormatException extends Exception {
    FormatException(String message, Throwable cause) { super(message, cause); }
}

static String lire(String ligne) throws FormatException {
    String[] champs = ligne.split(";");
    if (champs.length != 2)
        throw new FormatException("« " + ligne + " » : 2 champs attendus", null);
    try {
        double note = Double.parseDouble(champs[1]);
        return champs[0] + " a " + note;
    } catch (NumberFormatException e) {
        throw new FormatException("« " + ligne + " » : note illisible", e);  // e devient la cause
    }
}

Le programme de test appelle lire sur chaque ligne et, en cas de FormatException, affiche son message puis sa cause (e.getCause()) quand elle existe :


Alice a 12.5
Ligne rejetée : « Bruno;quinze » : note illisible
  cause : java.lang.NumberFormatException: For input string: "quinze"
Ligne rejetée : « Chloé » : 2 champs attendus

L'appelant reçoit une exception qui parle son langage (« ligne rejetée »), sans perdre le détail technique : le constructeur Exception(String message, Throwable cause) garde l'exception d'origine, et une trace de pile complète l'afficherait sous la mention Caused by.

100 % gratuit

La suite du chapitre est sur Adloun

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →