Exceptions personnalisées
Fait partie de la section Programmation Orientée Objet du Journey Java de Coddy. Leçon 60 sur 87.
Les exceptions intégrées de Java couvrent de nombreux scénarios d’erreur courants, mais vous avez parfois besoin d’exceptions spécifiques au domaine de votre application. Les exceptions personnalisées vous permettent de créer des types d’erreur explicites qui communiquent clairement ce qui n’a pas fonctionné.
Pour créer une exception personnalisée, étendez simplement une classe d’exception existante. Pour une exception vérifiée, étendez Exception :
public class InsufficientFundsException extends Exception {
public InsufficientFundsException(String message) {
super(message);
}
}Pour une exception non vérifiée, étendez RuntimeException :
public class InvalidAgeException extends RuntimeException {
public InvalidAgeException(String message) {
super(message);
}
}L’appel super(message) transmet le message d’erreur à la classe parente, ce qui le rend accessible via getMessage(). Vous pouvez ensuite lancer et intercepter votre exception personnalisée comme n’importe quelle autre :
public void withdraw(double amount) throws InsufficientFundsException {
if (amount > balance) {
throw new InsufficientFundsException("Balance too low: " + balance);
}
balance -= amount;
}
// Utilisation
try {
account.withdraw(1000);
} catch (InsufficientFundsException e) {
System.out.println(e.getMessage());
}Les exceptions personnalisées rendent votre code plus lisible et permettent aux appelants de gérer différemment des conditions d’erreur spécifiques. Elles sont particulièrement utiles lors de la création d’API ou de bibliothèques, où une communication claire des erreurs est importante.
Défi
FacileConstruisons un système de réservation de billets qui utilise des exceptions personnalisées pour gérer différents scénarios d’erreur ! Vous créerez des types d’exceptions explicites qui indiqueront clairement ce qui n’a pas fonctionné lors de la réservation de billets.
Vous organiserez votre code sur quatre fichiers :
TicketSoldOutException.java: créez une exception vérifiée personnalisée (qui étendException) pour le cas où les billets ne sont plus disponibles. Votre exception doit accepter un message dans son constructeur et le transmettre à la classe parente à l’aide desuper(message).InvalidSeatException.java: créez une exception non vérifiée personnalisée (qui étendRuntimeException) pour le cas où quelqu’un essaie de réserver un numéro de siège invalide. Cette exception doit également accepter un message et le transmettre à sa classe parente.TicketBooth.java: créez une classe qui gère la vente des billets. Votre guichet doit suivre le nombre total de sièges disponibles ainsi que le numéro de siège valide le plus élevé. Incluez :Un constructeur qui reçoit le nombre total de sièges disponibles.
Une méthode
bookTicket(int seatNumber)qui valide la réservation. S’il ne reste aucun billet (le nombre de sièges disponibles est inférieur ou égal à 0), lancez uneTicketSoldOutExceptionavec le message"No tickets remaining". Si le numéro de siège est inférieur à 1 ou supérieur au nombre total de sièges, lancez uneInvalidSeatExceptionavec le message"Seat [seatNumber] does not exist". Sinon, diminuez le nombre de sièges disponibles de 1 et affichezBooked seat [seatNumber] successfully.Une méthode
getAvailableSeats()qui renvoie le nombre actuel de sièges disponibles.Main.java: assemblez votre système de réservation de billets ! Vous recevrez deux entrées : le nombre total de sièges et un numéro de siège à réserver.Créez un
TicketBoothavec le nombre total de sièges fourni. Tentez ensuite de réserver le numéro de siège spécifié dans un bloc try-catch. CommeTicketSoldOutExceptionest une exception vérifiée, vous devez la gérer. Interceptez d’abordTicketSoldOutExceptionet affichezBooking failed: [exception message]. Interceptez ensuiteInvalidSeatExceptionet affichez le même format :Booking failed: [exception message].Après le bloc try-catch, affichez
Remaining seats: [count]en utilisant la méthode d’accès.
Vous recevrez deux entrées dans l’ordre : le nombre total de sièges (entier) et le numéro de siège à réserver (entier).
Remarquez que les exceptions vérifiées obligent les appelants à les gérer (avec try-catch ou throws), tandis que les exceptions non vérifiées ne nécessitent pas de gestion explicite. Choisissez le type d’exception selon que l’erreur est quelque chose que les appelants doivent anticiper et gérer !
Essayez vous-même
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int totalSeats = scanner.nextInt();
int seatNumber = scanner.nextInt();
// TODO: Créer un TicketBooth avec le nombre total de sièges donné
// TODO: Utiliser un bloc try-catch pour tenter de réserver le siège
// - Attraper d'abord TicketSoldOutException et afficher "Booking failed: [exception message]"
// - Attraper InvalidSeatException et afficher "Booking failed: [exception message]"
// TODO: After the try-catch, print "Remaining seats: [count]"
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesChamps (Attributs)Méthode constructeurSurcharge de constructeurRécapitulatif - Calculatrice simple4Héritage
Héritage de base (extends)Le mot-clé superRedéfinition de méthode (@Override)Chaînage de constructeursLa classe ObjectHéritage simple et multiniveauPourquoi pas d'héritage multiple de classesRécapitulatif - Hiérarchie des employés7Méthodes spéciales et classe Object
Méthode toString()equals() et hashCode()Méthode clone()compareTo() et ComparableInterface ComparatorRécapitulatif - Tri personnalisé10Gestion des exceptions en POO
Hiérarchie des classes d'exceptionExceptions personnaliséesErreurs Checked vs UncheckedPattern Try-with-resourcesRécapitulatif - Utilisateur validé2Modificateurs d'accès et Encapsulation
Aperçu des niveaux d'accèsMéthodes Getter et SetterMasquage d'informationsLe mot-clé finalRécapitulatif - Gestionnaire de compte bancaire5Polymorphisme
Bases de la surcharge de méthodesRedéfinition de méthodes (Run-Time)Upcasting et DowncastingL'opérateur instanceofClasses et méthodes abstraitesRécapitulatif - Calculateur de formes8Concepts avancés de la POO
Composition vs HéritageAgrégation vs CompositionClasses internes, imbriquées et anonymesEnums et méthodes d'EnumRecords (Java 16+)Classes scellées (Java 17+)11Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron MonteurPatron ObservateurPatron Stratégie3Propriétés de classe et membres statiques
Variables d'instance vs variables statiquesMéthodes statiquesBlocs statiquesConstantes (static final)Récapitulatif - Compteur et utilitaire6Interfaces et Classes Abstraites
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesDefault et Static dans les InterfacesClasses Abstraites vs InterfacesInterfaces FonctionnellesRécapitulatif - Système de Paiement9La généricité
Introduction à la généricitéClasses génériquesMéthodes génériquesParamètres de type bornésWildcards (?, extends, super)Récapitulatif - Conteneur générique12Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositePatron ItérateurEntraînez-vous par vous-même : Compilateur Java en ligne