Menu
Coddy logo textTech

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.

challenge icon

Défi

Facile

Construisons 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 étend Exception) 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 de super(message).
  • InvalidSeatException.java : créez une exception non vérifiée personnalisée (qui étend RuntimeException) 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 une TicketSoldOutException avec 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 une InvalidSeatException avec le message "Seat [seatNumber] does not exist". Sinon, diminuez le nombre de sièges disponibles de 1 et affichez Booked 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 TicketBooth avec 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. Comme TicketSoldOutException est une exception vérifiée, vous devez la gérer. Interceptez d’abord TicketSoldOutException et affichez Booking failed: [exception message]. Interceptez ensuite InvalidSeatException et 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]"
    }
}
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur Java en ligne