![]() ![]() |
|
![]() ![]() |
Java possiede un meccanismo che permette al
programmatore di trattare le situazioni anomale in modo flessibile,
elegante e perfettamente integrato con la metodologia orientata ad
oggetti:
Come funziona il meccanismo di gestione delle eccezioni?
Ad esempio, se in un ciclo che legge dati da internet cade la connessione, è naturale gestire questa situazione da programma senza causarne necessariamente la terminazione. |
![]() ![]() |
|
![]() ![]() |
Per sperimentare con la propagazione delle eccezioni, si compili e si esegua la classe NestedNullPointer:
La macchina astratta Java scriverà qualcosa come:
elencando la catena dei metodi attivi nel momento in cui si verifica l'eccezione (bar - foo - main) e per ogni metodo la linea di codice dove si è verificata. |
![]() ![]() |
|
![]() ![]() |
Per comprendere bene il meccanismo di gestione
delle eccezioni, è utile vedere come questo si integra con il paradigma
orientato ad oggetti:
|
![]() ![]() |
|
![]() ![]() |
Vediamo un "frammento" della gerarchia di classi di eccezioni di Java (nel prossimo esempio cattureremo un'eccezione ArrayIndexOutOfBoundsException):
|
![]() ![]() |
|
![]() ![]() |
Se una chiamata di metodo può generare
un'eccezione, possiamo racchiuderla in un blocco
try,
seguito da uno o più blocchi catch
contenenti le istruzioni da eseguire in corrispondenza dell'eccezione lanciata.
Esempio: Stampa di un array usando eccezioni (CatchOutOfBounds):
Attenzione: è un buon esempio di try-catch, ma è un PESSIMO stile di programmazione!!! |
![]() ![]() |
|
![]() ![]() |
try { <istruzioni-try>; // possono lanciare delle eccezioni } catch(<sottoclasse-Throwable1> e1) { // catturiamo l'eccezione e1 di tipo <sottoclasse-Throwable1> <istruzioni-catch1>; // gestiamo e1 } catch(<sottoclasse-Throwable2> e2) { // catturiamo l'eccezione e2 di tipo <sottoclasse-Throwable2> <istruzioni-catch2>; // gestiamo e2 } ... catch(<sottoclasse-ThrowableN> eN) { // catturiamo l'eccezione eN di tipo <sottoclasse-ThrowableN> <istruzioni-catchN>; // gestiamo e2 } finally { // istruzioni da eseguire comunque <istruzioni-finally>; } |
Se è presente almeno un blocco catch, allora il blocco finally è facoltativo.
![]() ![]() |
|
![]() ![]() |
|