In questo post, vedremo cos’è un’eccezione nel linguaggio Java, quali sono le tipologie di eccezioni e come creare le proprie eccezioni personalizzate.
Cos’è un’eccezione?
Un’eccezione è un evento anomalo che si verifica durante l’esecuzione di un programma e che interrompe il flusso normale delle istruzioni. Ad esempio, se proviamo a dividere un numero per zero, otterremo un’eccezione di tipo ArithmeticException. Un’eccezione può essere causata da un errore del programmatore, da un input errato dell’utente, da una condizione eccezionale del sistema o da altri fattori imprevisti.
Quando si verifica un’eccezione, il programma può reagire in diversi modi:
- Ignorare l’eccezione e continuare l’esecuzione, se possibile. Questo può portare a risultati inaspettati o errati.
- Terminare l’esecuzione e mostrare un messaggio di errore all’utente. Questo può essere frustrante per l’utente e rendere il programma poco affidabile.
- Gestire l’eccezione e ripristinare il flusso normale delle istruzioni. Questo è il modo consigliato di trattare le eccezioni, in quanto permette di controllare il comportamento del programma e di evitare conseguenze indesiderate.
In Java, le eccezioni sono rappresentate da oggetti di classi che derivano dalla classe base Exception.
Tipi di eccezioni Java
Le eccezioni si dividono in due categorie principali:
- Eccezioni controllate (checked exceptions): sono eccezioni che il compilatore può prevedere e che il programmatore deve gestire esplicitamente. Ad esempio, se proviamo a leggere un file che non esiste, otterremo un’eccezione di tipo FileNotFoundException. Questa è un’eccezione controllata, in quanto il compilatore ci obbliga a scrivere del codice per gestirla o per propagarla ad altri metodi. Le eccezioni controllate sono sottoclassi dirette o indirette della classe Exception, ma non della classe RuntimeException.
- Eccezioni non controllate (unchecked exceptions): sono eccezioni che il compilatore non può prevedere e che il programmatore non è obbligato a gestire. Ad esempio, se proviamo ad accedere a un elemento di un array che non esiste, otterremo un’eccezione di tipo ArrayIndexOutOfBoundsException. Questa è un’eccezione non controllata, in quanto il compilatore non ci impone di scrivere del codice per gestirla o per propagarla ad altri metodi. Le eccezioni non controllate sono sottoclassi dirette o indirette della classe RuntimeException.
Come creare le proprie eccezioni Java
A volte, potremmo voler creare le nostre eccezioni personalizzate per rappresentare situazioni specifiche del nostro programma. Per farlo, dobbiamo definire una classe che estende la classe Exception (se vogliamo creare un’eccezione controllata) o la classe RuntimeException (se vogliamo creare un’eccezione non controllata). Inoltre, dobbiamo fornire almeno un costruttore che accetta una stringa come parametro e la passa al costruttore della classe base. Ad esempio:
public class MiaEccezione extends Exception {
public MiaEccezione(String messaggio) {
super(messaggio);
}
}
Per lanciare la nostra eccezione personalizzata, dobbiamo usare la parola chiave throw seguita da una nuova istanza della nostra classe. Ad esempio:
if (condizione) {
throw new MiaEccezione("Si è verificato un problema");
}
Per gestire la nostra eccezione personalizzata, dobbiamo usare la parola chiave catch seguita da una variabile di tipo MiaEccezione. Ad esempio:
try {
// codice che potrebbe lanciare MiaEccezione
} catch (MiaEccezione me) {
// codice per gestire MiaEccezione
}
Esempio pratico eccezioni in Java:
Supponiamo che stiamo scrivendo un’applicazione di banca online e vogliamo creare un’eccezione personalizzata per gestire il caso in cui un utente tenta di prelevare più denaro di quello che ha sul conto. Possiamo creare una classe InsufficientFundsException
che estende la classe Exception
:
public class InsufficientFundsException extends Exception {
public InsufficientFundsException(String message) {
super(message);
}
}
In questo esempio, InsufficientFundsException
estende la classe Exception
e ha un costruttore che accetta una stringa come parametro. Questa stringa rappresenta il messaggio di errore associato all’eccezione.
Ecco un esempio di come utilizzare InsufficientFundsException
in un programma Java:
public void withdraw(double amount) throws InsufficientFundsException {
if (amount > balance) {
throw new InsufficientFundsException("Fondi insufficienti!");
}
balance -= amount;
}
In questo esempio, il metodo withdraw()
può sollevare un’eccezione InsufficientFundsException
se l’utente tenta di prelevare più denaro di quello che ha sul conto. Il blocco catch
gestisce l’eccezione stampando un messaggio di errore.