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