Bonjour ! Dans le module précédent, nous avons assemblé les pièces maîtresses de la programmation orientée objet, en apprenant à construire des architectures logicielles solides avec les classes abstraites et les interfaces. Vous savez désormais comment structurer le "cas idéal", où tout fonctionne comme prévu.
Nous ouvrons aujourd'hui un nouveau chapitre essentiel pour tout développeur professionnel : la gestion des exceptions. Car dans le monde réel, les programmes doivent faire face à l'imprévu : une connexion réseau qui coupe, un fichier qui n'existe pas, une donnée utilisateur invalide... Cette leçon pose la première pierre de ce nouveau module. L'objectif est d'apprendre à classifier les différents types d'erreurs en Java en explorant la hiérarchie des exceptions et en maîtrisant la distinction fondamentale entre les exceptions vérifiées (checked) et non-vérifiées (unchecked). Comprendre cette taxonomie est indispensable pour écrire du code qui est non seulement fonctionnel, mais aussi résilient.
1. Qu'est-ce qu'une exception ?
Lorsque votre code rencontre une situation anormale qui interrompt son déroulement normal, Java "lève" une exception. Contrairement à certains langages où une erreur peut être une simple valeur de retour (comme -1 ou false), en Java, une exception est un objet à part entière. Cet objet contient des informations sur l'erreur qui s'est produite : son type, le message d'erreur et l'endroit exact où elle est survenue dans le code (la "pile d'appels" ou stack trace).
Apprendre Java #14 Exception (try catch finally)
La vidéo "Apprendre Java #14" de la chaîne JirAWS introduit cette idée de manière très claire.
Regardez ce court passage pour bien saisir la définition d'une exception en Java. Définition et famille : Notez bien que les exceptions sont des objets qui appartiennent à une famille plus large, les Throwable.
2. La hiérarchie des Throwable
En Java, tout ce qui peut être "jeté" (levé) comme une erreur ou une exception hérite d'une classe mère commune : java.lang.Throwable. Cette classe a deux "enfants" principaux qui représentent deux grandes catégories de problèmes : Error et Exception.

La classe Error
Les objets de type Error signalent des problèmes graves liés à l'environnement d'exécution de Java (la JVM) lui-même. Ce sont des situations catastrophiques desquelles une application ne peut généralement pas se remettre.
- Exemples :
OutOfMemoryError(la JVM n'a plus de mémoire disponible),StackOverflowError(généralement causé par une récursivité infinie qui sature la pile d'appels). - Gestion : Une application ne doit pas essayer de capturer ou de gérer ces erreurs. Elles indiquent un problème si fondamental que la seule action raisonnable est de laisser le programme s'arrêter.
Apprendre Java #14 Exception (try catch finally)
La même vidéo de JirAWS explique bien la différence entre une Error et une Exception.
Erreurs vs. Exceptions : Retenez que les Error sont hors du contrôle de votre programme.
La classe Exception
C'est la classe qui nous intéresse le plus. Elle représente des conditions anormales qu'une application pourrait raisonnablement vouloir gérer. Par exemple, un fichier qu'on essaie de lire n'existe pas, ou un utilisateur saisit du texte là où un nombre est attendu.
C'est ici que se trouve la distinction la plus importante en Java, une qui influence directement la manière dont vous écrivez votre code. La classe Exception se subdivise elle-même en deux grandes catégories.
La chaîne EvoluNoob propose une excellente visualisation de cette hiérarchie, en faisant le lien avec le concept d'héritage que nous avons vu dans le module précédent.
Regardez ce segment pour voir comment les différentes classes d'exception s'emboîtent les unes dans les autres, des plus générales aux plus spécifiques. Hiérarchie des exceptions : Le schéma montre comment une InputMismatchException (liée à une saisie utilisateur incorrecte) fait partie d'une longue lignée qui remonte jusqu'à Throwable.
3. La distinction cruciale : Checked vs. Unchecked
Cette distinction est au cœur du mécanisme de gestion des erreurs en Java. Elle est imposée par le compilateur et vous force à réfléchir aux erreurs possibles lorsque vous écrivez votre code.
Les exceptions non-vérifiées (Unchecked Exceptions)
Ce groupe comprend :
- Toutes les classes qui héritent de
RuntimeException. - Toutes les classes qui héritent de
Error.
Elles sont appelées "non-vérifiées" car le compilateur ne vous oblige pas à les gérer. Il ne vérifiera pas si vous avez mis en place un bloc try-catch ou si vous les avez déclarées.
- Quel est leur rôle ? Elles signalent principalement des erreurs de programmation (bugs) ou des problèmes critiques à l'exécution.
NullPointerException: Vous tentez d'utiliser un objet dont la référence estnull. C'est un bug à corriger.ArrayIndexOutOfBoundsException: Vous essayez d'accéder à un indice qui n'existe pas dans un tableau. C'est un bug à corriger.IllegalArgumentException: Vous avez passé un argument invalide à une méthode. C'est un bug à corriger.
L'idée fondamentale est que vous devriez écrire votre code de manière à ce que ces exceptions n'arrivent jamais. On ne les "gère" pas, on les "corrige".
Maîtriser la gestion des exceptions en Java : guide essentiel - Anaska
Cet article du site anaska.fr résume parfaitement la philosophie derrière les RuntimeException.
Lisez la section Types d’exceptions et hiérarchie Exception Java. Concentrez-vous sur la phrase : "Selon Oracle, les RuntimeException correspondent à des erreurs à corriger dans le code, tandis que les exceptions vérifiées exigent une gestion explicite." Le tableau fournit également d'excellents exemples.
Les exceptions vérifiées (Checked Exceptions)
Ce groupe comprend toutes les classes qui héritent de Exception mais qui n'héritent pas de RuntimeException.
Elles sont appelées "vérifiées" car le compilateur vous oblige à les gérer. Si vous appelez une méthode qui peut lever une exception vérifiée, vous avez deux choix, sinon votre code ne compilera pas :
- Gérer l'exception en entourant l'appel de méthode d'un bloc
try-catch. - Propager l'exception en ajoutant une clause
throwsà la signature de votre propre méthode.
- Quel est leur rôle ? Elles représentent des conditions d'erreur prévisibles et souvent récupérables qui sont hors du contrôle direct du programmeur. Ce ne sont pas des bugs, mais des situations que le programme doit anticiper.
IOException: Une erreur s'est produite lors d'une lecture ou écriture de fichier. Le fichier n'existe peut-être pas, ou le disque est plein.SQLException: Un problème est survenu lors de la communication avec une base de données. Le serveur de base de données est peut-être éteint.FileNotFoundException: Un cas spécifique deIOException.
Développons en Java - La gestion des exceptions
Ce document de Jean-Michel Doudoux est une référence classique et très précise sur le sujet.
Lisez attentivement les sections Les exceptions personnalisées et L'utilisation des exceptions. Concentrez-vous sur les paragraphes qui définissent les exceptions "contrôlées (checked)" et "non contrôlées (unchecked)". Notez cette phrase clé : "Java n'oblige à déclarer les exceptions dans l'en-tête de la méthode que pour les exceptions dites contrôlées (checked)". La section 9.6 résume ensuite parfaitement les trois types d'exceptions.
4. Tableau récapitulatif
Voici un résumé pour vous aider à consolider ces concepts.
| Catégorie | Classe(s) Parente(s) | Exemples | Gestion | Philosophie |
|---|---|---|---|---|
| Checked (Vérifiée) | Exception (sauf RuntimeException) |
IOException, SQLException |
Obligatoire (vérifié à la compilation) : try-catch ou throws. |
Gérer les problèmes externes, prévisibles et récupérables. |
| Unchecked (Non-vérifiée) | RuntimeException |
NullPointerException, ArrayIndexOutOfBoundsException |
Optionnelle. Non vérifié par le compilateur. | Signale des erreurs de programmation (bugs) à corriger. |
| Error (Erreur) | Error |
OutOfMemoryError, StackOverflowError |
Non recommandée. | Signale des pannes critiques de la JVM, non récupérables. |
Conclusion
Félicitations ! Vous venez de décortiquer l'un des aspects les plus structurants de Java. Comprendre cette hiérarchie et la différence entre les exceptions vérifiées et non-vérifiées est une étape fondamentale pour devenir un développeur Java compétent.
Points clés à retenir :
- Toutes les erreurs et exceptions héritent de
Throwable. - Les
Errorsont des problèmes graves de la JVM que l'on ne gère pas. - Les
Exceptionsont des problèmes liés au programme, qui se divisent en deux catégories. - Les exceptions vérifiées (checked) forcent le développeur à gérer les erreurs prévisibles à la compilation (
IOException). - Les exceptions non-vérifiées (unchecked) signalent des bugs dans le code et ne sont pas contrôlées par le compilateur (
NullPointerException).
Maintenant que vous savez identifier et classifier les différents types d'erreurs, la prochaine leçon sera très pratique. Nous allons apprendre à utiliser les outils que Java nous donne pour les maîtriser : les blocs try, catch et finally.