Lever, attraper et propager une exception

Le mécanisme d'exception de Java : throw, try, catch, finally, remontée dans la pile d'appels jusqu'au premier catch compatible, ordre des catch et try-with-resources.

  • 25 cartes
  • 5 thèmes
  • Gratuit

Le programme, thème par thème

Le poids de chaque thème suit celui que lui donne l'examen.

  1. Notions
  2. Questions
  3. Ranger et relier
  4. Mises en situation
  5. Comprendre

Quelques cartes du deck

  • Lever une exception (throw) : de quoi s'agit-il ?

    Voir la réponse

    Instruction qui lance un objet exception, le plus souvent créé sur place avec new, et interrompt aussitôt le code en cours pour signaler qu'un problème est survenu.

    throw new IllegalArgumentException("amount: -3"); : les instructions qui suivent ne s'exécutent pas, et Java cherche un catch compatible.

  • Qu'affiche ce programme ?

    ```java
    static void convert() {
    System.out.println("convert");
    Integer.parseInt("x");
    System.out.println("converted");
    }
    static void read() {
    try {
    convert();
    System.out.println("read ok");
    } catch (NumberFormatException e) {
    System.out.println("caught");
    } finally {
    System.out.println("finally");
    }
    System.out.println("after");
    }
    public static void main(String[] args) {
    read();
    System.out.println("end");
    }
    `

    • convert, caught, finally, after, end
    • convert, converted, read ok, finally, after, end
    • convert, caught, after, end
    • convert, caught, finally, end
    Voir la réponse

    convert, caught, finally, after, end

    parseInt lève NumberFormatException : converted et read ok sont sautés. Le catch traite l'exception, le finally s'exécute, et comme l'exception est attrapée, read se termine normalement : after et end sont affichés.

  • Quand plusieurs blocs catch se suivent, c'est le … dont le type est compatible qui s'exécute ; les types les plus … se placent donc avant les plus généraux.

    Voir la réponse

    Quand plusieurs blocs catch se suivent, c'est le premier dont le type est compatible qui s'exécute ; les types les plus précis se placent donc avant les plus généraux.

    Java essaie les catch de haut en bas et s'arrête au premier compatible : un catch général placé en tête intercepterait tout ce que les suivants devaient recevoir.

  • Attraper une exception (catch) : de quoi s'agit-il ?

    Voir la réponse

    Bloc qui reçoit une exception d'un type compatible, levée dans le bloc try associé, et exécute le code de traitement.

    Un catch reçoit son type et ses sous-classes : catch (RuntimeException e) attrape une IllegalStateException, mais pas une IOException.

  • Une méthode entoure un traitement de try { … } catch (Exception e) { }. En production, les données enregistrées sont fausses et aucun message n'apparaît nulle part. Quelle est la cause ?

    • catch (Exception e) ne reçoit pas les exceptions levées par la méthode elle-même
    • Le bloc try est ignoré à l'exécution quand le catch ne contient aucune instruction
    • Le catch vide avale l'exception : l'erreur est attrapée mais jamais traitée ni journalisée
    • Les exceptions attrapées sont toujours transmises au finally, qui doit les afficher
    Voir la réponse

    Le catch vide avale l'exception : l'erreur est attrapée mais jamais traitée ni journalisée

    Un catch vide fait disparaître le problème sans le résoudre : le programme continue avec un état incohérent. Il faut au minimum journaliser l'exception, ou la laisser remonter à qui sait la traiter.