• Home
  • Docker
  • Kubernetes
  • LLMs
  • Java
  • Ubuntu
  • Maven
  • Big Data
  • Archived
Java | Exceptions
  1. Exceptions
  2. Gestion des exceptions
  3. Les clauses try catch finally
  4. Lancer une exception : throw
  5. Déclarer une exception : throws
  6. Créer sa propre exception

  1. Exceptions
    Les exceptions dans Java sont groupées en trois types de classes :
    • les erreurs (classe : Error),
    • les exceptions non-vérifiées (unchecked exceptions) par le compilateur (classe : RuntimeException),
    • et les exceptions vérifiées (checked exceptions) par le compilateur (classe : Exception).


    Les exceptions vérifiées et non vérifiées par le compilateur (checked/unchecked exceptions) :
    • Les exceptions vérifiées par le compilateur (checked exceptions) sont des exceptions pour les quelles le compilateur va générer une erreur de compilation s'elles ne sont pas gérées par le code. Cela concerne toutes les exceptions qui sont de type (ou sous type de) Exception mais qui ne sont pas du type (ou sous type de) RuntimeException.

    • Les exceptions non vérifiées par le compilateur (unchecked exceptions) sont les exceptions de type Throwable, de type (ou sous type de) Error, ou de type (ou sous type de) RuntimeException.
  2. Gestion des exceptions
    Pour gérer une exception on utilise le bloc de code try/catch :

    Résultat d'exécution du code :
    NOTE : L'exception ArithmeticException est une sous-classe de la classe RuntimeException (unchecked exception), et donc le compilateur ne se plaindra pas si on ne gère pas cette exception par un bloc try/catch :

    Résultat d'exécution du code :
    Cette fois ci, lorsque la JVM a rencontré l'exception, le programme a terminé son exécution.

    NOTE : La gestion des exceptions permet d'arrêter la propagation des exceptions dans la pile d'exécution (appels de méthodes).
    En absence de la gestion des exceptions, elles peuvent être propagées jusqu'à la méthode principale (main) ; ce qui signifie l'arrêt du programme s'elles ne sont pas gèrer par cette méthode.

    Remarque : Bien que la gestion des exceptions est possible pour toutes les exceptions de type (ou sous type de) Throwable, elle n'a cependant un vrai intérêt que pour les exceptions de type (ou sous type de) Exception. En fait, le programme doit gérer seulement les exceptions applicatives, et rare les cas où on s'intéressera à gérer les exceptions de type Error (erreurs JVM par exemple).
  3. Les clauses try catch finally
    Les clauses try, catch, finally permettent de gérer des exceptions :
    • try : détermine le bloc du code qui est susceptible de lancer une exception.

    • catch : permet d'attraper une exception lancée par le bloc du code de la clause try.

    • finally : permet de faire des actions spécifiques suite à l'exécution du bloc du code de la clause try et, si c'est le cas, de la clause catch.

    Les règles d'utilisation des clauses try, catch, finally sont :
    • La clause try doit être utilisée avec la clause catch et/ou finally. Si la clause try n'est pas suivie par au moins une des deux clauses catch et finally, le compilateur générera une erreur de compilation.

    • Chaque gestion d'exception peut avoir autant de clauses catch si nécessaire.

    • Le type de l'exception d'une clause catch doit avoir un type d'exception différents des autres clauses catch. Sinon le compilateur va générer une erreur de compilation :

    • Le type de l'exception d'une clause doit être un sous type ou un type différent des types des autres clauses définies au dessous de cette clause. Sinon le compilateur va générer une erreur de compilation :

    • Lorsque le bloc d'une clause est exécuté, les autres clauses ne seront pas exécutées, et cela même si le code de cette clause déclenche lui aussi une exception. La nouvelle exception doit être gérer à l'intérieur d'un autre bloc try catch.

      Résultat d'exécution du code :
    • La clause finally peut être utilisée avec ou sans des clauses catch.
      Une clause finally sans les clauses catch peut être utile dans les cas où on veut faire un traitement spécial sans pour autant arrêter la propagation de l'exception.

      Résultat d'exécution du code :
    • Le code de la clause finally va toujours être exécuté peu importe s'il y a des clauses catch ou pas.
      Il va être exécuté même si le code d'une clause est exécuté et que celui-ci lance une nouvelle exception.

      Résultat d'exécution du code :
  4. Lancer une exception : throw
    Il est possible de lancer une exception par le code, par exemple lorsqu'on rencontre une situation incorrecte lors de l'exécution du code.
    Résultat d'exécution du code :
    Cet exemple est inutile, mais on y voit bien l'utilisation du mot clé throw pour lancer une exception applicative.
  5. Déclarer une exception : throws
    Une méthode qui lancent des exceptions (ou qui fait appel à des méthodes qui sont susceptibles de lancer eux même des exceptions) peut déclarer ces exceptions et ainsi les autres méthodes qui font appels à cette méthode pourront savoir qu'elle lance des exceptions et ainsi les gérer ou les déclarer à leurs tours.

    Bien que la déclaration peut inclure tous les types des exceptions (Throwable, Error, Exception, RuntimeException), le compilateur ne fait la vérification que pour les exceptions de type Exception. C'est la même règle qu'on a vu ci-dessus pour la gestion des exceptions vérifiables par le compilateur. En fait on vient de la généraliser, puisque la règle en Java est : gérer ou déclarer une exception, sinon le compilateur va générer une erreur de compilation.

    Pour déclarer une exception on utilise le mot clé throws comme suit : throws Exception
    Pour déclarer plusieurs exceptions, on les sépare par des virgules comme suit : throws ArithmeticException, Exception

    Résultat d'exécution du code :
    Une méthode doit soit gérer ou déclarer les exceptions déclarées par les méthodes appelées par le code de cette méthode (cella s'applique uniquement aux exceptions vérifiables par le compilateur).

    Dans l'exemple précédent la méthode main gère l'exception lancée par la méthode divide, au cas contraire la méthode main doit déclarer elle aussi cette exception (sinon le compilateur va générer une erreur de compilation).


    Résultat d'exécution du code :
    Notez que le code n'a pas terminé son exécution à cause que l'exception n'a pas été gérer par un bloc try catch et comme la méthode main et la dernière méthode de la pile d'exécution, la JVM arrête donc la propagation de l'exception et met fin à l'exécution du programme.
  6. Créer sa propre exception
    Il faut signaler que les exceptions sont des classes qui héritent de la classe Object.

    La création d'une nouvelle exception est utile lorsqu'on veut gérer un type particulier d'exception et ainsi la distinguer des autres exceptions.

    La classe de la nouvelle exception doit étendre une des classes Throwable, Error, ou Exception ou n'import quelle autre classe qui hérite de ces classes.

    Dans l'exemple suivant:
    Pas besoin de gérer l'exception ArithmeticException car non vérifiées par le compilateur.
    Pas besoin de gérer l'exception SmallNumberException car déclarée par la méthode main.
    Mais attention : Si les exceptions SmallNumberException et ArithmeticException ne sont pas gérées, l'exécution du programme pourrait s'arrêter avant d'atteindre la fin du code si ces exceptions sont lancées.




    Résultat d'exécution du code :
© 2025  mtitek