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 custom vous permettent de créer des types d’erreur significatifs qui communiquent clairement ce qui s’est mal passé.
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 class parente, le rendant available via getMessage(). Tu peux ensuite lancer et intercepter ton custom exception 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 custom pour gérer différents scénarios d'erreur ! Vous créerez des types d'exception explicites qui indiquent clairement ce qui s'est mal passé lors de la réservation de billets.
Vous organiserez votre code dans quatre fichiers :
TicketSoldOutException.java: Créez une exception custom checked (extendsException) lorsque les billets ne sont plus available. Votre exception doit accepter un message dans son constructeur et le transmettre à la classe parente avecsuper(message).InvalidSeatException.java: Créez une exception custom unchecked (extendsRuntimeException) lorsqu'une personne tente de réserver un numéro de siège invalid. Cette exception doit également accepter et transmettre un message à sa classe parente.TicketBooth.java: Créez une class qui manages la vente de billets. Votre guichet doit suivre le number total de sièges available ainsi que le plus grand numéro de siège valide. Incluez :Un constructeur qui prend le number total de sièges available.
Une
bookTicket(int seatNumber)method qui valide la réservation. Si aucun billet ne reste (le number de sièges available est égal ou inférieur à 0), lancez uneTicketSoldOutExceptionavec le message"No tickets remaining". Si le numéro de siège est inférieur à 1 ou supérieur au total de sièges, lancez uneInvalidSeatExceptionavec le message"Seat [seatNumber] does not exist". Otherwise, diminuez le number de sièges available de 1 et affichezBooked seat [seatNumber] successfully.Une method
getAvailableSeats()qui renvoie le count actuel de sièges available.Main.java: Assemblez votre système de réservation de billets ! Vous recevrez deux entrées : le number total de sièges et un numéro de siège à réserver.Créez un
TicketBoothavec le total de sièges given. Tentez ensuite de réserver le numéro de siège spécifié dans un bloc try-catch. PuisqueTicketSoldOutExceptionest checked, vous must le gérer. InterceptezTicketSoldOutExceptionen first et affichezBooking failed: [exception message]. Interceptez ensuiteInvalidSeatExceptionet affichez le même format :Booking failed: [exception message].After le bloc try-catch, affichez
Remaining seats: [count]en utilisant la method getter.
Vous recevrez deux entrées dans l'ordre : le total de sièges (entier) et le numéro de siège à réserver (entier).
Remarquez comment les exceptions checked obligent les appelants à les gérer (avec try-catch ou throws), tandis que les exceptions unchecked 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 traiter !
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