![]() ![]() |
|
![]() ![]() |
Le eccezioni si dividono in due categorie:
Ogni volta che scriviamo un'istruzione che potrebbe lanciare un'eccezione controllata, allora
|
![]() ![]() |
|
![]() ![]() |
La clausola throws viene inserita nella dichiarazione del metodo per informare il compilatore che durante l'esecuzione di quel metodo possono essere generate eccezioni (controllate) dei tipi elencati dopo la parola chiave throws, la cui gestione viene delegata al chiamante. Cattivo esempio:
Per evitare di dover gestire le eccezioni potremmo scrivere
tutti i metodi così:
O magari fingere di gestire ogni genere di eccezione in modo che il compilatore non segnali errori:
Così si perde molta informazione sul programma. Ignorare un problema non porta mai alla sua soluzione!
|
![]() ![]() |
|
![]() ![]() |
Perché?
Riassumendo:
|
![]() ![]() |
|
![]() ![]() |
In tutti gli esempi visti l'eccezione era
lanciata dall'interprete quando si verificava una situazione
imprevista. Talvolta un metodo può trovarsi a non poter gestire dei dati che riconosce come errati (ad esempio, ricevendo dei dati in lettura che non corrispondono al formato atteso)... Cosa fare in questi casi? Invece di elaborare dati errati si può lanciare un'eccezione con il comando throw. Sintassi
Importante:
|
![]() ![]() |
|
![]() ![]() |
Un esempio: IllegalTimeException
Supponiamo di avere definito la classe
Time contenente il costruttore di default, il metodo
toString(), ed il metodo
setTime() per
impostare un orario ammissibile. Come succede spesso nella
progettazione di classi di questo tipo, dobbiamo decidere come gestire il passaggio
di valori errati al metodo setTime().
Una soluzione semplice è la seguente:
Una alternantiva ragionevole in questa situazione è
quella di lanciare un'opportuna eccezione se il valore dei parametri
è errato, ad esempio una IllegalArgumentException: dopotutto
è dovere di chi invoca il metodo passare valori corretti.
Per indicare in maniera più precisa la natura dell'errore possiamo definire
una nuova classe di eccezioni IllegalTimeException:
Adesso possiamo estendere la classe Time con la classe RobustTime, sovrascrivendo opportunamente il metodo setTime().
Infine possiamo testare la classe col seguente programma TestTime :
|