14 06 Gestion de plusieurs exceptions

Dans cette vidéo, nous allons lever manuellement une exception personnalisée depuis le constructeur d'une classe. L'objectif : refuser la création d'un objet Voiture si le nombre de kilomètres saisi est négatif, en propageant une NonVoitureException bien explicite.

Lever l'exception dans le constructeur

Le principe est simple : dans le constructeur de Voiture, on ajoute une condition. Si elle est vérifiée (kilométrage négatif), on lève une exception du type NonVoitureException. Pour cela, deux mots-clés sont à connaître :

  • throws : il s'ajoute à la signature de la méthode ou du constructeur pour signaler à la JVM que ce code est potentiellement dangereux et doit être appelé dans un bloc try/catch. Il est suivi du nom de la classe d'exception concernée.
  • throw : il permet de lever manuellement l'exception, en instanciant un nouvel objet du type voulu via throw new NonVoitureException(...).

Ainsi, l'exception personnalisée capturera bien notre logique métier (« ce kilométrage n'est pas valide pour une voiture ») et sera traitée comme un objet de la classe NonVoitureException par les blocs catch qui l'attendent.

Une fois cette modification appliquée au constructeur, écrivons un test côté main :

Voiture v = new Voiture("J'ai trop envie", "Marque X", -100);

L'IDE signale immédiatement une erreur : depuis le changement du constructeur, toute instanciation doit gérer les exceptions susceptibles d'être levées. On enveloppe donc l'appel dans un bloc try/catch. Au passage, attention au type de la variable de kilométrage : déclarée en int, elle ne doit pas être confondue avec un String côté constructeur — un cast ou une signature cohérente est nécessaire.

Dès que ces ajustements sont faits, l'erreur disparaît, le code compile et s'exécute. Le constructeur protège désormais notre modèle métier contre les saisies invalides, en levant proprement une exception dédiée. À très vite dans la prochaine vidéo.

En résumé

Cette leçon explique comment lever et gérer des exceptions personnalisées en Java. Elle démontre l'ajout d'une condition dans le constructeur d'une classe Voiture pour valider les paramètres (par exemple, refuser un nombre de kilomètres négatif) et lever une exception de type NonVoitureException en cas de violation. Elle couvre l'utilisation du mot-clé `throws` dans la signature de la méthode pour informer la JVM que des exceptions peuvent être levées, ainsi que l'utilisation du bloc try-catch pour capturer et traiter ces exceptions lors de l'instanciation de l'objet.

Points clés

  • Utiliser le mot-clé `throws` dans la signature d'une méthode pour déclarer qu'elle peut lever une exception à la JVM
  • Utiliser le mot-clé `throw` pour lever manuellement une exception en instanciant un objet exception
  • Créer des exceptions personnalisées (comme NonVoitureException) pour des cas métier spécifiques plutôt que d'utiliser les exceptions génériques
  • Entourer l'appel d'une méthode susceptible de lever une exception avec un bloc try-catch pour la gérer correctement
  • Les exceptions capturées sont traitées en tant qu'objets de leur classe exception respective, ce qui permet une gestion différenciée
  • Le compilateur Java force le programmeur à gérer les exceptions levées, c'est pourquoi une erreur de compilation apparaît sans try-catch

Questions fréquentes

Quelle est la différence entre `throws` et `throw` ?

`throws` est un mot-clé de signature qui déclare qu'une méthode peut lever une exception (informer la JVM et le compilateur). `throw` est la commande qui lève réellement l'exception manuellement en instanciant un objet exception.

Pourquoi le compilateur force-t-il à ajouter un bloc try-catch ?

Parce que le constructeur est maintenant déclaré avec `throws NonVoitureException`, le compilateur oblige le code qui appelle ce constructeur à gérer l'exception potentielle via un bloc try-catch ou en la redéclarant avec `throws`.

Comment fonctionne une exception personnalisée en Java ?

Une exception personnalisée comme NonVoitureException est définie comme une classe qui étend Exception. Quand une condition invalide est détectée (par exemple, des kilomètres négatifs), le code lève cette exception avec `throw new NonVoitureException()`, et elle est capturée par le bloc catch pour être traitée.