Eccezione
Eccezioni
• Eccezione = Anomalia
• Un’eccezione è un evento generato in
un’applicazione in circostanze eccezionali
In Java
– Anomalia di funzionamento
– Errore
• Esempi di eccezioni:
–
–
–
–
Oggetto Eccezione
• Un’eccezione è un oggetto che descrive una
situazione anomala o di errore
• Al verificarsi di una situazione anomala il
programma lancia (throw) un’eccezione cioè
un oggetto della classe Throwable
• L’eccezione blocca l’esecuzione del metodo
in cui è stata lanciata
• Un’eccezione può essere trattata in due
modi:
– Può essere “catturata”
– Può essere “propagata”
La classe Throwable
• Un oggetto di tipo Throwable è una
eccezione o un errore
• Creazione:
– Throwable(“Messaggio che descrive l’eccezione”)
– Throwable()
• Metodi principali:
– getMessage() restituisce il messaggio associato
all’eccezione
– printStackTrace( stream ) restituisce una
“fotografia” dello stack di esecuzione sull’oggetto
stream (PrintWriter o PrintStream)
Java - Eccezioni
Divisione per 0
Utilizzo di un file che non esiste
Riferimento ad un oggetto non istanziato
…
Gerarchia delle eccezioni
Object
Throwable
Exception
Error
RuntimeException
LinkageError
Virtual MachineError
AWTError
ArthemticException
IndexOutOfBoundException
NullPointerException
NoSuchMethodException
ClassNotFoundException
Cattura (catch) delle
eccezioni
• Un’eccezione può essere
“catturata” nel metodo che l’ha
generata provocando:
– l’interruzione dell’esecuzione della
parte del codice che l’ha generata
– l’esecuzione di una parte di codice
che ha la responsabilità di gestire
l’eccezione
1
Eccezioni controllate e non
controllate
Propagazione delle
eccezioni
• Un’eccezione può essere controllata o non
controllata
• Un’eccezione controllata può essere
sollevata solo in un blocco try o in un metodo
che dichiara di poter lanciare un’eccezione di
quel tipo con la clausola throw
• Il compilatore segnala se un’eccezione
controllata non viene gestita propriamente
• Un’eccezione non controllata non richiede
una gestione esplicita con la clausola throw
• Un’eccezione può essere “propagata”
verso il metodo che ha invocato quello
che ha generato l’eccezione.
• Se l’eccezione è propagata anche
dall’ultimo metodo dello stack (il metodo
main) viene catturata dal System
Exception Handler della Java Virtual
Machine che interrompe l’esecuzione
restituendo un messaggio di errore a
Run-Time
try … catch
Catch
• Prova (try) ad eseguire il codice e
intercetta (catch) un’eccezione, se
avviene, per porgli rimedio
try
{
blocco_1
}
catch (Classe-eccezione e)
{
blocco_2
}
finally
• Un’istruzione try può avere una clausola
finally opzionale
• Se non viene sollevata nessuna eccezione, le
istruzioni nella clausola finally vengono
eseguite dopo che si è concluso il blocco try
• Se si verifica un’eccezione, le istruzioni nella
clausola finally vengono eseguite dopo le
istruzioni della clausola catch
• Le istruizioni della clausola finally vengono
quindi sempre eseguite
Java - Eccezioni
• Un blocco try è seguito da una o più clausole
catch, che specificano quali eccezioni
vengono gestite
– Ogni clausola catch corrisponde a un tipo di
eccezione sollevata
• Quando si verifica un’eccezione, l’esecuzione
del codice viene interrotta e l’ interprete
controlla se ci sia un blocco catch
corrispondente al tipo di eccezione gettata
• Se l’eccezione è gestita da più clausole
catch, viene eseguita solo la prima
Generare eccezioni
• Un’ eccezione può essere generata:
– in modo implicito dal sistema runtime
• ArithmeticException
• IndexOutOfBoundsException
• SecurityException
• NullPointerException
• ...
– in modo esplicito per mezzo dell’istruzione throw :
• throw e;
• Es. throw new Exception();
2
throw
• Le eccezioni vengono generate
propriamente con l’ istruzione
throw
•
Throw oggetto-eccezione;
• dove oggetto-eccezione deve
appartenere a una classe derivate
da Throwable
Esempio 1
class Eccezioni1
{
public static void main(String args[])
{
int dividendo;
dividendo=5;
int divisore;
int risultato;
divisore=0;
risultato=dividendo/divisore;
System.out.println(risultato);
}
}
/* L'output di questo programma è il seguente:
Exception in thread "main" java.lang.ArithmeticException: /
by zero at Eccezioni1.main(Eccezioni1.java:9) */
class Eccezioni3
{
public static void main(String args[])
{
int dividendo;int divisore;int risultato;
dividendo=5;
divisore=0;
try
{
risultato=dividendo/divisore;
System.out.println(risultato);
}
catch (Exception e)
{
System.out.println(“Si è verificata una eccezione");
}
finally
{
System.out.println(“Istruzioni sempre eseguite");
}
}
}
/* Output del programma:
Si è verificata una eccezione
Istruzioni sempre eseguite */
Java - Eccezioni
Clausola throws
• Un metodo che può generare
un’eccezione deve contenere la
clausola throws nella sua dichiarazione
• Esempio:
modificatore Tipo nomeMetodo(parametri) throws Tipoecc1, Tipoecc2 …;
• Altro esempio:
public void leggi() throws Exception;
• Questo permette al compilatore di
controllare l’eventuale mancanza di
gestori per le eccezioni generate
Esempio 2
class Eccezioni2
{
public static void main(String args[])
{
int dividendo;int divisore;int risultato;
dividendo=5;
divisore=0;
try
{
risultato=dividendo/divisore;
System.out.println(risultato);
}
catch (Exception e)
{
System.out.println(“Si è verificata una eccezione");
}
}
}
/* Output del programma:
Si è verificata una eccezione */
class Eccezioni4
{
public static void main(String args[])
{
try
{
System.out.println("prima riga");
throw new Exception();
System.out.println("seconda riga");
}
catch (Exception e)
{
System.out.println(“Si è verificata una eccezione");
}
}
}
/* Output del programma:
prima riga
Si è verificata una eccezione */
/* In realtà il programma non viene compilato perchè
System.out.println("seconda riga"); non è raggiungibile */
3