ATTENZIONE: il nuovo sito di riferimento per questa guida e altre cose più o meno interessanti è il mio BLOG

Indice
Prossimo capitolo - Collezioni di oggetti

Capitolo 5 - Creare e gestire le eccezioni

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.

Gestire le eccezioni

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.

Ignorare le eccezioni

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".



Indice
Prossimo capitolo - Collezioni di oggetti