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.
Sfida
FacileCostruiamo 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 estendeException) per i casi in cui i biglietti non sono più disponibili. L'eccezione deve accettare un messaggio nel costruttore e passarlo alla classe genitore usandosuper(message).InvalidSeatException.java: crea un'eccezione non controllata personalizzata (che estendeRuntimeException) 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 unaTicketSoldOutExceptioncon il messaggio"No tickets remaining". Se il numero del posto è minore di 1 o maggiore del numero totale di posti, lancia unaInvalidSeatExceptioncon il messaggio"Seat [seatNumber] does not exist". Altrimenti, diminuisci di 1 i posti disponibili e stampaBooked 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
TicketBoothcon 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 primaTicketSoldOutExceptione stampaBooking failed: [exception message]. Poi intercettaInvalidSeatExceptione 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]"
}
}
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
1Fondamenti della programmazione a oggetti
File esterniIntroduzione alla programmazione a oggettiClassi e oggettiLa parola chiave thisMetodiCampi (attributi)Metodo costruttoreSovraccarico dei costruttoriRipasso - Calcolatrice semplice4Ereditarietà
Ereditarietà di base (extends)La parola chiave superSovrascrittura dei metodi (@Override)Concatenamento dei costruttoriLa classe ObjectEreditarietà singola e multilivelloPerché non esiste l'ereditarietà multipla delle classiRiepilogo: gerarchia dei dipendenti7Metodi speciali e classe Object
Metodo toString()equals() e hashCode()Metodo clone()compareTo() e ComparableInterfaccia ComparatorRiepilogo - Ordinamento personalizzato10Gestione delle eccezioni in OOP
Gerarchia delle classi di eccezioneEccezioni personalizzateEccezioni controllate e non controllatePattern try-with-resourcesRiepilogo - Utente validato2Modificatori di accesso e incapsulamento
Panoramica dei livelli di accessoMetodi getter e setterNascondimento delle informazioniLa parola chiave finalRiepilogo - Gestore di conti bancari5Polimorfismo
Nozioni di base sull'overloading dei metodiOverride dei metodi (a runtime)Upcasting e downcastingL'operatore instanceofClassi e metodi astrattiRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàAggregazione vs composizioneClassi interne, annidate e anonimeEnum e metodi degli EnumRecord (Java 16+)Classi sealed (Java 17+)11Modelli di progettazione Parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern BuilderPattern ObserverPattern Strategy3Proprietà di classe e membri statici
Variabili di istanza e staticheMetodi staticiBlocchi staticiCostanti (static final)Riepilogo - Contatore e utility6Interfacce e classi astratte
Introduzione alle interfacceImplementazione delle interfacceImplementazione di più interfacceMetodi default e static nelle interfacceClassi astratte e interfacce a confrontoInterfacce funzionaliRiepilogo: sistema di pagamento9Tipi generici
Introduzione ai tipi genericiClassi genericheMetodi genericiParametri di tipo con limitiCaratteri jolly (?, extends, super)Riepilogo - Contenitore generico12Modelli di progettazione – Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern IteratorEsercitati da solo: Compilatore Java online