Corso di Java

Istruzioni per il controllo delle eccezioni

 

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