ATTENZIONE: il nuovo sito di riferimento per questa guida e altre cose più
o meno interessanti è
il mio BLOG
Nei linguaggi "tipo C" tipicamente le funzioni segnalano eventuali errori tramite il valore di ritorno.
In java (e non solo) si preferisce usare un meccanismo diverso, le eccezioni. Quando un metodo deve segnalare una situazione anomala, o che comunque richiede una certa attenzione, lancia un'eccezione:
// qualcosa e' andato storto! throw new MiaEccezione();Come si può vedere un'eccezione è una classe come le altre, derivata da
java.lang.Exception
:
public class MiaEccezione extends Exception {}La cosa più importante per un'eccezione è il nome, che dovrebbe essere significativo.
Un metodo che lancia un'eccezione, che non sia una RuntimeException, deve dichiararlo:
public int read() throws IOException // notare la 's' { ... }Un metodo che chiama
read()
può gestire l'eccezione
o lanciarla a sua volta.
Se la lancia deve dichiararlo:
public int metodo1() throws IOException { ... n = read(); // puo' generare IOException ... }In alternativa, se è opportuno, può "catturarla":
public int metodo2() { ... try { 5 n = read(); } catch(IOException e) { System.err.println("Generata una eccezione di I/O!"); e.printStackTrace(); } catch(Exception e) { 10 System.err.println("Generata una eccezione!"); e.printStackTrace(); } finally { System.err.println("Blocco try terminato!"); } 15 }La parola try, in linea 4, indica l'inizio del blocco di codice da controllare; se il codice genera un'eccezione il blocco catch corrispondente al suo tipo viene eseguito. Nel blocco catch si deve gestire al meglio l'eccezione, ad esempio liberando risorse, stampando messaggi di errore, uscendo con
System.exit(1)
, eccetera - al limite si può anche
rilanciare l'eccezione con throw.
Da notare che con la clausola catch(Exception e)
vengono catturate
tutte le eccezioni. Il blocco opzionale finally
viene eseguito per ultimo.
Le eccezioni possono venire ignorate usando una clausola tipo:
catch(Exception e) {}o lanciandole "fuori" dal main, alla console:
public static void main(String[] args) throws Exception { ... n = read(); ... }Naturalmente questa pratica va usata solo per brevi programmi di test, non per codice "di produzione".