Lezione di Java 28 – Le eccezioni in Java

Indice Lezione PrecedenteLezione Successiva


La gestione degli errori in Java, le cosiddette eccezioni, sono gestite tramite le clausole try, cacth e finally. Il codice che potrebbe lanciare una eccezione è inglobato in un blocco marcato try, a questo blocco deve seguire uno o più blocchi catch o un blocco finally.
I blocchi catch, detti exception handler, servono a catturare un determinato tipo di eccezioni (in particolare l’eccezione e le sue sottoclassi); il blocco finally serve ad assicurare che un determinato numero di istruzioni venga sempre eseguito (ad esempio nel caso in cui un programma apre dei file, con finally ci assicureremo di chiuderli correttamente prima della terminazione del programma).

  int i=10;
  int j=0;
  try {
    int k=i/j; // 10/0 causa un ArithmeticException e
  }
  catch ( ArithmeticException e) {
    System.out.println("Eccezione catturata, divisione per zero!");
  }
  catch ( Exception e) {
    System.out.println("Eccezione generale catturata");
  }
  finally {
    System.out.println("Verrò eseguito sempre");
  }

Come si può notare, nel blocco try è stato inserito il codice che avrebbe potuto lanciare un’eccezione, nelle clausole catch le eccezioni da catturare.
L’ordine con cui possono essere catturate le eccezioni è importante, non si possono avere problemi di grande maggiore:

  try {
    // Codice che genera una NullPointerException
  }
  catch ( Exception e) {...}
  catch ( NullPointerException e) {...}

l’esempio precedente non genererà un errore di compilazione, una NullPointerException verrà catturata sempre come eccezione generale di tipo Exception. E’ sconsigliato utilizzare un’unica clausola catch di tipo generale, le eccezioni sono fatte per non far crashare un programma, servono a risolvere i problemi se vengono generati errori e far continuare l’esecuzione del programma senza problemi. Vediamo la gerarchie delle interruzioni:

Quando viene chiamato un metodo che potrebbe richiamare un’eccezione questa deve essere dichiarata o gestita. La regola Handle or Declare ci dice che: deve gestire l’eccezione fornendo le opportune sezioni try/catch; oppure propagare l’eccezione dichiarandola nell’intestazione del metodo (attraverso la clausola throws).

void metodo() throws Exception { }

indica che chi utilizzerà il seguente metodo deve gestire o dichiarare eccezioni di tipo Exception. Se l’annidamento di tutti metodi, clausole try/catch non riescono a fermare l’eccezione, questa “emerge” di metodo in metodo fino ad arrivare al main stampando lo StackTree, l’albero dello stack del programma in cui non è stata gestita l’eccezione.

Le eccezioni della classe RunTimeException sono dette unchecked, tutte le altre checked, questo perchè le eccezioni unchecked, insieme agli errori, non devono essere gestiti obbligatoriamente, quindi non seguono obbligatoriamente la regola dell’H&D, dato che sono problemi di natura differente, i primi non dipendono dal programma (crash del sistema, memoria completamente occupata, ecc), mentre i secondi sono problemi dovuti al programmatore (divisioni per zero, ecc). E’ consigliabile non scomodare la gestione delle eccezioni per problemi facilmente risolvibili con la correzzione del codice (se si accede ad una locazione in un puntatore non valida, non ha senso gestire una NullPointerException, meglio correggere il problema).

E’ possibile dichiarare delle proprie interruzioni semplicemente estendendo una classe:

class MiaEccezione extends Exception { }

Ti piace l’articolo?
Diventa fan su Facebook
Indice Lezione PrecedenteLezione Successiva
Pubblicato in Guide, Guide, Java, Programmazione Taggato con: , ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*