Nella scorsa puntata abbiamo incontrato, nel metodo main della classe
TestCondizionali, un nuovo insieme di istruzioni nella
forma:
try {
istruzioni
} catch (IOException e) {
istruzioni
}
il cui significato è legato alla possibilità offerta da Java di
gestire le eccezioni.
Un’eccezione è un evento, spesso inatteso, che si
verifica durante l’esecuzione di un programma e ne impedisce
la normale prosecuzione.
Ad es. il programma TestCondizionali presentato la volta scorsa
prevede l’introduzione di una stringa da una riga di comando,
necessaria per poterne effettuare l’elaborazione secondo
l’algoritmo descritto nella lezione 26:
se si verifica un’eccezione durante la lettura della stringa
occorre intraprendere delle azioni opportune.
Fortunatamente Java offre un meccanismo che aiuta il programmatore
a scrivere applicazioni robuste (cioè applicazioni in grado di
resistere a condizioni particolari, come il sollevamento di un’eccezione)
permettendo di definire degli exception handler, ovvero
porzioni di codice che reagiscono ad uno specifico tipo di eccezione
consentendo al programma di proseguire dopo averla opportunamente
gestita.
Le eccezioni in Java sono oggetti appartenenti alla gerarchia
delle classi: quelle predefinite dal linguaggio hanno origine
dalla superclasse Throwable, mentre quelle create dal programmatore
estendono la classe Exception.
Un oggetto eccezione indica il tipo di errore e contiene alcune
altre informazioni, come ad es. il punto in cui è avvenuto l’errore.
Per gestire le situazioni in cui possono verificarsi anomalie
in fase di esecuzione si utilizza un costrutto del tipo:
try {
istruzioni
} catch (TipoEccezione1 varEccezione) {
istruzioni
} catch (TipoEccezione2 varEccezione) {
istruzioni
} finally {
istruzioni
}
in cui il blocco successivo all’istruzione try contiene
istruzioni che possono sollevare un’eccezione e ogni blocco
catch identifica la sequenza di operazioni che devono gestire
il particolare tipo di eccezione indicato nel parametro.
Ogni blocco catch deve essere associato ad un’istruzione
try ed è possibile associare più blocchi catch ad
una sola istruzione try, uno per ogni tipo di eccezione
che essa può sollevare.
Quando si verifica un’eccezione all’interno del blocco
try vengono eseguite le istruzioni relative al blocco catch
per quel particolare tipo di eccezione.
Il blocco finally deve essere associato ad un’istruzione
try e identifica una sequenza di istruzioni che vengono
eseguite comunque, indipendentemente dal sollevamento o meno di
un’eccezione nel relativo blocco try.
Un’istruzione try deve avere almeno un blocco catch
o finally associato ad essa.
Alcune eccezioni possono essere sollevate automaticamente dalla
Java Virtual Machine al verificarsi di determinate condizioni;
tuttavia al programmatore è consentito sollevare esplicitamente
un’eccezione tramite l’istruzione throw, secondo
la sintassi:
throw eccezione;
L’istruzione throw interrompe il normale flusso del
programma e tenta di trovare un exception handler per il
tipo di eccezione sollevata.
Questa opportunità permette al programmatore di defin s
= linea.readLine();
...
} catch (IOException e) {
Syire eccezioni proprie e di sollevarle in situazioni specifiche: più
avanti nel corso vedremo in che modo è possibile realizzare un’adeguata strategia
di gestione delle eccezioni.
Per il momento accontentiamoci di analizzare il comportamento della nostra
applicazione, esaminando i due blocchi try/catch che essa contiene:
try {
...
stem.err.print("Errore: ");
e.printStackTrace();
}
Entrambi i blocchi del codice eseguono la lettura di una stringa dalla riga
di comando e si pongono in ascolto di una possibile eccezione della classe
IOException.
Poiché un’eccezione di questo tipo può essere sollevata dal metodo readLine(),
se si omette di inserire il codice in un blocco try/catch il compilatore
Java si rifiuta di eseguire la compilazione, costringendo di fatto il programmatore
a prendere atto di possibili situazioni d’errore: nulla vieta comunque di
lasciare vuoto il blocco catch.
Qualsiasi sia l’eccezione generata è possibile ricavare informazioni su di
essa richiamando alcuni metodi sull’oggetto eccezione, tra i quali:
| printStackTrace() |
Scrive sullo standard error stream la traccia di esecuzione dello stack al momento del sollevamento dell’eccezione. |
| getMessage() |
Ritorna una stringa di errore relativo a quell’oggetto di tipo eccezione oppure null. |
| getClass() |
Ritorna la classe cui appartiene l’oggetto eccezione. |
Torna all'indice Generale del corso di Corso di Java di Software Planet