Menu
Coddy logo textTech

Eccezioni personalizzate

Fa parte della sezione Programmazione orientata agli oggetti del percorso Java di Coddy. Lezione 60 di 87.

Le eccezioni integrate di Java coprono molti scenari di errore comuni, ma a volte hai bisogno di eccezioni specifiche del dominio della tua applicazione. Le eccezioni personalizzate ti permettono di creare tipi di errore significativi che comunicano chiaramente che cosa è andato storto.

Per creare un'eccezione personalizzata, basta estendere una classe di eccezione esistente. Per un'eccezione verificata, estendi Exception:

public class InsufficientFundsException extends Exception {
    public InsufficientFundsException(String message) {
        super(message);
    }
}

Per un'eccezione non verificata, estendi RuntimeException:

public class InvalidAgeException extends RuntimeException {
    public InvalidAgeException(String message) {
        super(message);
    }
}

La chiamata super(message) passa il messaggio di errore alla classe genitore, rendendolo disponibile tramite getMessage(). Puoi quindi lanciare e intercettare la tua eccezione personalizzata come qualsiasi altra:

public void withdraw(double amount) throws InsufficientFundsException {
    if (amount > balance) {
        throw new InsufficientFundsException("Balance too low: " + balance);
    }
    balance -= amount;
}

// Utilizzo
try {
    account.withdraw(1000);
} catch (InsufficientFundsException e) {
    System.out.println(e.getMessage());
}

Le eccezioni personalizzate rendono il tuo codice più leggibile e permettono a chi chiama di gestire in modo diverso condizioni di errore specifiche. Sono particolarmente utili quando si creano API o librerie in cui è importante comunicare chiaramente gli errori.

challenge icon

Sfida

Facile

Costruiamo un sistema di prenotazione dei biglietti che usa eccezioni personalizzate per gestire diversi scenari di errore! Creerai tipi di eccezione significativi che comunicano chiaramente cosa è andato storto durante la prenotazione dei biglietti.

Organizzerai il codice in quattro file:

  • TicketSoldOutException.java: crea un'eccezione controllata personalizzata (che estende Exception) per i casi in cui i biglietti non sono più disponibili. L'eccezione deve accettare un messaggio nel costruttore e passarlo alla classe genitore usando super(message).
  • InvalidSeatException.java: crea un'eccezione non controllata personalizzata (che estende RuntimeException) per i casi in cui qualcuno tenta di prenotare un posto non valido. Anche questa eccezione deve accettare un messaggio e passarlo alla classe genitore.
  • TicketBooth.java: crea una classe che gestisce la vendita dei biglietti. La biglietteria deve tenere traccia del numero totale di posti disponibili e del numero di posto valido più alto. Includi:

    Un costruttore che accetta il numero totale di posti disponibili.

    Un metodo bookTicket(int seatNumber) che convalida la prenotazione. Se non rimangono biglietti (i posti disponibili sono 0 o meno), lancia una TicketSoldOutException con il messaggio "No tickets remaining". Se il numero del posto è minore di 1 o maggiore del numero totale di posti, lancia una InvalidSeatException con il messaggio "Seat [seatNumber] does not exist". Altrimenti, diminuisci di 1 i posti disponibili e stampa Booked seat [seatNumber] successfully.

    Un metodo getAvailableSeats() che restituisce il conteggio attuale dei posti disponibili.

  • Main.java: metti insieme il sistema di prenotazione dei biglietti! Riceverai due input: il numero totale di posti e il numero del posto da prenotare.

    Crea una TicketBooth con il numero totale di posti specificato. Poi prova a prenotare il posto indicato all'interno di un blocco try-catch. Poiché TicketSoldOutException è un'eccezione controllata, devi gestirla. Intercetta prima TicketSoldOutException e stampa Booking failed: [exception message]. Poi intercetta InvalidSeatException e stampa lo stesso formato: Booking failed: [exception message].

    Dopo il blocco try-catch, stampa Remaining seats: [count] usando il metodo getter.

Riceverai due input, nell'ordine: il numero totale di posti (intero) e il numero del posto da prenotare (intero).

Nota come le eccezioni controllate obbligano chi le invoca a gestirle (con try-catch o throws), mentre le eccezioni non controllate non richiedono una gestione esplicita. Scegli il tipo di eccezione in base al fatto che l'errore sia qualcosa che chi invoca il codice dovrebbe prevedere e da cui dovrebbe poter recuperare!

Provalo tu

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: Crea un TicketBooth con il numero totale di posti indicato
        
        // TODO: Usa un blocco try-catch per tentare di prenotare il posto
        // - Intercetta prima TicketSoldOutException e stampa "Booking failed: [exception message]"
        // - Intercetta InvalidSeatException e stampa "Booking failed: [exception message]"
        
        // TODO: Dopo il blocco try-catch, stampa "Remaining seats: [count]"
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Java online