Programmazione a Oggetti e JAVA Prof. B.Buttarazzi A.A. 2012/2013 Sommario • Gestione degli errori • Eccezioni • Categorie di eccezioni – checked – unchecked • Gestione delle eccezioni – Clausola throws – Costrutto try - catch - finally • Lanciare nuove eccezioni - Comando throw • Definire nuove eccezioni • Esercizi 16/01/2013 2 Gestione degli errori Generalmente i programmi contengono istruzioni “critiche”, che possono causare errori che portano alla terminazione improvvisa del programma. Questa anomalia può dipendere sia dal codice scritto (es. quando tentiamo di eseguire una divisione per 0, attribuiamo all’indice di un array un valore al di fuori dell’intervallo consentito, ecc.) sia dall’ambiente hardware (es. disco pieno, connessione di rete non disponibile…) Con altri linguaggi di programmazione per evitare questa eventualità (errori e conseguente terminazione anomala dei programmi) si cerca di prevedere e gestire in modo appropriato (inserendo opportuni controlli if… then con conseguente appesantimento del codice) tutte le situazioni che possono produrre errori. 16/01/2013 3 Gestione degli errori Una tipica istruzione “critica” (che può causare la terminazione improvvisa del programma) è la lettura di dati da input. Si ricorda che in Java, il dispositivo standard di input è rappresentato dalla variabile (statica) System.in, appartenente alla classe InputStream che fornisce solo il metodo read() (che permette di leggere singoli byte), pertanto per leggere le stringhe si usa la classe BufferedReader, che fornisce il metodo apposito readLine() 16/01/2013 4 Ottengo il programma dove sono evidenziati gli errori 16/01/2013 Corso di Fondamenti di Informatica1 5 Ottengo il programma dove sono evidenziati gli errori Il compilatore ci segnala che potenzialmente nel metodo main sarà generata una eccezione! 16/01/2013 Corso di Fondamenti di Informatica1 6 Ottengo il programma dove sono evidenziati gli errori 16/01/2013 Corso di Fondamenti di Informatica1 7 Ottengo il programma dove sono evidenziati gli errori L’istruzione readLine() in caso di errore in fase di input solleva una IOException 16/01/2013 Corso di Fondamenti di Informatica1 8 Ottengo il programma dove sono evidenziati gli errori 16/01/2013 Corso di Fondamenti di Informatica1 9 Ottengo il programma dove sono evidenziati gli errori Come suggerito dal compilatore abbiamo aggiunto nella signature del metodo la c throws dello stesso tipo di eccezione lanciata. Tramite questa clasusola si demanda al chiamante la gestione dell’eccezione. 16/01/2013 Corso di Fondamenti di Informatica1 10 Istruzione di lettura ..se devo leggere un dato numerico è necessario: InputStreamReader In = new InputStreamReader(System.in); BufferedReader Tastiera = new BufferedReader(In); int numero; System.out.print("Immettere un numero : "); numero=Integer.parseInt(Tastiera.readLine()); System.out.println("numero inserito: " + numero); 16/01/2013 11 Istruzione di lettura ..se devo leggere un dato numerico è necessario: InputStreamReader In = new InputStreamReader(System.in); BufferedReader Tastiera = new BufferedReader(In); se la stringa restituita da readLine() non corrisponde alla sintassi di un int numero; numero intero Integer.parseInt() solleva una NumberFormatException System.out.print("Immettere un numero : "); numero=Integer.parseInt(Tastiera.readLine()); System.out.println("numero inserito: " + numero); 16/01/2013 12 Il compilatore ci segnala che potenzialmente nel metodo sarà generata anche una ecc formato del dato . 16/01/2013 13 Il concetto di eccezione Java per ovviare ai possibili errori a cui può andare incontro un programma durante la sua normale esecuzione, adotta un approccio innovativo, introducendo il concetto di eccezione. Una eccezione è un evento anomalo e indesiderato che non consente la normale prosecuzione del programma . Esempi: •divisione per 0: • java.lang.ArithmeticException •indice di un array al di fuori dell’intervallo consentito • -java.lang.ArrayIndexOutOfBoundsException •formato numerico errato • java.lang.NumberFormatException 16/01/2013 14 Le eccezioni Una eccezione Java è un oggetto, istanza della classe Throwable o di una sua sottoclasse. Le sottoclassi della classe Throwable sono due: -Exception -Error Object Throwable Error 16/01/2013 Exception 15 Le eccezioni Gli errori sono degli eventi anomali che non dipendono dalla nostra applicazione (es.: memoria insufficiente, problemi alla JVM, problemi con un dispositivo esterno, ecc.) e pertanto non possono essere gestiti; infatti, potenzialmente, qualunque codice del programma potrebbe lanciare questi errori che sarebbero completamente fuori dal controllo del programmatore. Object Le eccezioni, invece, sono l'opposto degli errori, ovvero, tutti quegli eventi che dipendono dal programma e che possono essere controllati e quindi gestiti. Throwable Error 16/01/2013 Exception 16 Categorie di eccezioni Il compilatore Java suddivide le Exception in due categorie: checked (verificate) e unchecked (non verificate). Considera checked (eccezioni verificate), le istanze della classe Exception mentre unchecked (non verificate) le istanze della classe RuntimeException Object Throwable Error Exception RuntimeException 16/01/2013 unchecked exceptions Checked exception 17 La distinzione tra le eccezioni verificate ( checked exception ) e non verificate (unchecked exception ) è importante in quanto il compilatore Java, per le eccezioni verificate, richiede il requisito dichiara (tramite la clausola throws) o intercetta ( try catch). Tutte le eccezioni che sono sottoclassi dirette o indirette di RunTimeException sono non verificate (es. ArrayIndexOutOfBounds , ArithmeticException). Tutte le classi che ereditano da Exception ma non da RuntimeException sono invece considerate eccezioni verificate. Il compilatore Java controlla ogni chiamata e dichiarazione di metodo per verificare se il metodo può lanciare eccezioni verificate. Object In caso positivo si assicura che sia soddisfatto il requisito dichiara (tramite la clausola throws) o intercetta ( try catch). Le eccezioni verificate devono obbligatoriamente essere dichiarte (tramite la clausola throws) o Throwable intercettate ( try catch)altrimenti non avviene la compilazione, come visto prima. Categorie di eccezioni Exception RuntimeException 16/01/2013 unchecked exceptions Checked exception 18 Categorie di eccezioni Le checked, exception rappresentano situazioni anomale in cui il programma puo' incappare, ma facilmente recuperabili. Object Throwable Error Exception RuntimeException 16/01/2013 unchecked exceptions Checked exception 19 Categorie di eccezioni Le unchecked exception possono potenzialmente capitare in qualsiasi programma e in qualsiasi momento dell'esecuzione (puntatori nulli, divisioni per zero, ecc). Sono solitamente imputabili a errori di progettazione o a mancati controlli sull'input dell'utente. Non devono obbligatoriamente essere gestite. Object Throwable Error Exception RuntimeException 16/01/2013 unchecked exceptions Checked exception 20 Alcune tra le più importanti eccezioni Java: • NullPointerException extends RunTimeException extends Exception : eccezione che viene lanciata quando si utilizza un puntatore nullo (Addio caro vecchio Segmentation Fault!!!). • ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException extends RunTimeException extends Exception : eccezione che viene lanciata quando si legge un array (Vettore o Lista) con indice non corretto (Ancora: addio caro vecchio Segmentation Fault!!!). • NumberFormatException extends IllegalArgumentException extends RunTimeException extends Exception : eccezione lanciata dalle Classi Wrapper quando si cerca di convertire in un Numero una stringa non correttamente Formattata. • IOException extends exception : eccezione lanciata dalla virtual machine quando una operazione di Input/Output non va a buon fine • FileNotFoundException extends IOException extends Exception : eccezione lanciata quando un file non viene trovato. Alcune tra le più importanti eccezioni Java: Categorie di eccezioni Le eccezioni checked vengono controllate dal compilatore (per questo si chiamano così), pertanto il compilatore si aspetta che nel metodo che potenzialmente le genera, ci siano gli appositi costrutti per il controllo e la gestione (corpo del metodo con costrutto try/catch o che, nella signature del metodo, ci sia una clausola throws dello stesso tipo di eccezione lanciata o di una sua superclasse - Se ciò non avviene si incorre in un errore di compilazione! ) Le eccezioni unchecked sono libere da costrizioni programmative: esse possono essere lanciate ovunque e, se non gestite, si propagano nello stack delle chiamate fino a causare la terminazione del programma. Questo approccio rende i programmi Java più robusti e affidabili. 16/01/2013 23 Gestione delle eccezioni Una eccezione è un oggetto Java e può essere: 1. Propagata verso il metodo chiamante che si occuperà di gestire l’eccezione tramite la clausola di propagazione nel metodo) throws (dichiarazione 2. Catturata e gestita tramite il costrutto try/catch 3. Generata da un metodo tramite throw 16/01/2013 24 Il costrutto try - catch • Il blocco try contiene un insieme di istruzioni che potrebbero generare eccezioni, se durante l'esecuzione una delle istruzioni genera un'eccezione, il flusso di esecuzione si interrompe, e la gestione passa al blocco catch incaricato di gestire l'eccezione sollevata. • Il blocco catch specifica quale eccezione si desidera gestire e quali istruzioni eseguire. • E' possibile rinserire più blocchi catch, in modo da permettere una gestione differenziata delle eccezioni generate dal blocco try. Nell’esempio riportato il compilatore prova (try) ad eseguire il blocco di istruzioni dopo la parola chiave try e se incontra un input non corretto lancia l’eccezione e si ferma! 16/01/2013 25 Il costrutto try - catch Un blocco try deve avere almeno un catch o finally; Se sono possibili più tipi di errore ci saranno più blocchi catch. Il corpo del blocco try viene eseguito fino al momento in cui viene sollevata un’eccezione da un’istruzione; a quel punto viene esaminata ogni clausola catch per vedere se il tipo dell’eccezione sollevata coincide con quella trattata dal blocco catch; se esiste il catch corrispondente , viene inizializzato l’identificatore (il parametro enamexxx) e vengono eseguite le istruzioni; nessuna altra catch verrà eseguita se non viene trovata nessuna catch adatta, l’eccezione è propagata al di fuori del try, ad altri try più esterni se presenti. Se è presente una finally, le sue istruzioni sono eseguite comunque, anche in assenza di eccezioni; la finally è solitamente usata per attuare e garantire la coerenza dello stato degli oggetti (ad esempio, chiudere file) Si noti che l’ordine delle catch è rilevante; Es. try { … } catch(NullPointerException npe) {} catch(IOExcetpion ioe) {} catch(Exception e) {} Si noti che la gestione di IOException deve precedere quella di Exception, dato che IOException è una sottoclasse di Exception. Per la stessa ragione, la gestione di Exception deve per forza comparire in fondo all'elenco. Il costrutto try - catch 16/01/2013 28 Gestione delle eccezioni:esempio 1 16/01/2013 29 Gestione delle eccezioni:esempio 16/01/2013 30 Gestione delle eccezioni:esempio Se durante l'esecuzione diamo un input sbagliato (la stringa tre), viene lanciata dal metodo main un'eccezione che viene intercettata dalla JVM che manda un messaggio e interrompe l’esecuzione del programma 16/01/2013 31 Gestione delle eccezioni:esempio Il messaggio mostra : •la stringa di input che ha causato l’errore •la linea di codice in cui è stata lanciata l’eccezione (20) •le chiamate dei metodi che hanno portato all’eccezione 16/01/2013 32 Gestione delle eccezioni:esempio Se si inserisce un dato numerico con formato errato viene lanciata l’eccezione NumberFormatExceoption (unchecked) 16/01/2013 33 Gestione delle eccezioni:esempio Il compilatore Java non verifica se un’eccezione non verificata (unchecked) viene intercettata o dichiarata. Le eccezioni non verificate possono essere prevenute (evitate) con codice appropriato. 16/01/2013 34 La gestione delle eccezioni è utile in fase di debugging in quanto Da informazioni sul verificarsi di anomalie Il messaggio mostra : •la stringa di input che ha causato l’errore •la linea di codice in cui è stata lanciata l’eccezione (20) •le chiamate dei metodi che hanno portato all’eccezione 16/01/2013 35 Per evitare che il programma si interrompa possiamo provare a racchiudere il comando di input in un blocco try-catch: Il messaggio mostra : •la stringa di input che ha causato l’errore •la linea di codice in cui è stata lanciata l’eccezione (20) •le chiamate dei metodi che hanno portato all’eccezione 16/01/2013 36 16/01/2013 37 Anche in questo caso il programma si interrompe! Per evitare questo comportamento (il blocco dell’esecuzione del programma) dobbiamo fare diversamente! Ad esempio possiamo racchiudere il try-catch in un blocco do while: 16/01/2013 38 Gestione delle eccezioni:esempio 2 16/01/2013 39 package provaeccezioni; import java.io.BufferedReader; import java.io.InputStreamReader; Altro esempio di gestione delle eccezioni Si distinguono i diversi tipi di eccezioni Si tenta il recupero di situazioni di errore public class prova6 { public static void main(String args[]) { InputStreamReader In = new InputStreamReader(System.in); BufferedReader Tastiera = new BufferedReader(In); int d=0, a=0; do{ System.out.println("Inserire a <immettere un numero maggiore di 0>: "); try { a=Integer.parseInt(Tastiera.readLine()); } catch(Exception e1) {System.out.println("errore nell'inserimento di a " ); }; System.out.println("numero inserito: " + a); } while (a<=0); boolean errore=false; do{ errore=false; System.out.println("Inserire d <immettere un numero maggiore di 0>: "); try { d=Integer.parseInt(Tastiera.readLine()); } catch(Exception e2) {System.out.println("errore nell'inserimento di d" );errore=true;}; }while (errore); try { } } System.out.println("numero inserito: " + d); a = 42 / d; System.out.println("valore calcolato :"+a); } catch (ArithmeticException e) { System.out.println("Divisione per zero");}; 16/01/2013 40 package provaeccezioni; import java.io.BufferedReader; import java.io.InputStreamReader; Importante : la clausola throws non è presente nel main in quanto è presente il costrutto try catch per la gestione delle eccezioni public class prova6 { public static void main(String args[]) { InputStreamReader In = new InputStreamReader(System.in); BufferedReader Tastiera = new BufferedReader(In); int d=0; a=0; do{ System.out.println("Inserire a <immettere un numero maggiore di 0>: "); try { a=Integer.parseInt(Tastiera.readLine()); } catch(Exception e1) {System.out.println("errore nell'inserimento di a " ); }; System.out.println("numero inserito: " + a); } while (a<=0); booleanerrore=false; do{ errore=false; System.out.println("Inserire d <immettere un numero maggiore di 0>: "); try { d=Integer.parseInt(Tastiera.readLine()); } catch(Exception e2) {System.out.println("errore nell'inserimento di d" );errore=true;}; } while (errore); System.out.println("numero inserito: " + d); try { a = 42 / d; System.out.println("valore calcolato :"+a); } catch (ArithmeticException e) { System.out.println("Divisione per zero");}; } } 16/01/2013 41 Costrutto try – catch - finally Il costrutto generale per la gestione delle eccezioni ha la seguente forma: try { istruzione1(); Parte normale!! istruzione2(); .... } catch(Exception1 e1) { // gestione dell'eventuale problema nato nel blocco try } Anche più di una!! catch(Exception2 e2) { // gestione dell'eventuale problema nato nel blocco try } finally { Facoltativa!! // codice da eseguire comunque al termine del blocco try } 16/01/2013 La clausola finally contiene un blocco di istruzioni da eseguire comunque dopo il blocco try, sia nel caso esso sia terminato senza problemi, sia nel caso abbia sollevato qualche eccezione. 42 L’istruzione throw Fino ad ora abbiamo visto • (throws ) che permette di delegare al metodo chiamante la gestione delle eccezioni che potrebbero essere sollevate, oppure • (try - catch ) che permette di gestire le eccezioni che potrebbero essere sollevate in un metodo all’interno del metodo stesso Ora invece vedremo come si opera se si desidera generare un'eccezione in un metodo e in che modo sia possibile creare eccezioni personalizzate per gestire situazioni anomale nei propri programmi. Utilizzeremo come esempio un metodo statico che calcola il fattoriale. Il metodo crea una nuova eccezione nel caso che il parametro di input sia negativo ! 16/01/2013 43 L’istruzione throw Le eccezioni possono essere generate con l’istruzione throw Solitamente un’istruzione throw è inclusa in un’istruzione if che valuta una condizione per verificare se deve essere sollevata l’eccezione 16/01/2013 44 L’istruzione throw 16/01/2013 45 L’istruzione throw package provaeccezioni; import java.io.*; public class prova7 { static int fattoriale(int n) throws Exception { if(n<0) throw new Exception("Il parametro deve essere int f = 1; for (int i=1;i<=n;i++) f = f * i; return f; } 16/01/2013 positivo"); Importante non confondere: la clausola throws che dichiara che un metodo rilancia all’esterno un’eccezione l’istruzione throw che solleva un’eccezione 46 Altro esempio package provaeccezioni; import java.io.*; public class prova3 { public static void main(String[] args) throws Exception { InputStreamReader In = new InputStreamReader(System.in); BufferedReader Tastiera = new BufferedReader(In); int x=0; do{ System.out.print("Immettere un numero maggiore di 0: "); try { x=Integer.parseInt(Tastiera.readLine()); } catch(Exception e) {System.out.println("errore " ); } }while (x<=0); System.out.println("numero inserito: " + x); if (x==5) throw new Exception("Impossibile usare il valore 5"); } } 16/01/2013 47 Esempio Per generare un’eccezione: prima si crea l’oggetto eccezione da lanciare poi lo si lancia con l’istruzione throw public int readInteger(String s) throws NumberFormatException, NumberTooBigException { int x = Integer.parseInt(s); if (x>100) throw new NumberTooBigException(); return x; } package provaeccezioni; import java.io.*; public class prova3 { public static void main(String[] args) throws Exception { InputStreamReader In = new InputStreamReader(System.in); BufferedReader Tastiera = new BufferedReader(In); int x=0; do{ System.out.print("Immettere un numero maggiore di 0: "); try { x=Integer.parseInt(Tastiera.readLine()); } catch(Exception e) {System.out.println("errore " ); } }while (x<=0); System.out.println("numero inserito: " + x); if (x==5) throw new Exception("Impossibile usare il valore 5"); } } l’istruzione throw genera un’eccezione 16/01/2013 49 Eccezioni definite dall’utente Nonostante l’enorme varietà di eccezioni già presenti in Java, il programmatore può facilmente crearne di proprie, qualora desideri segnalare condizioni di eccezione tipiche di un proprio programma. Per creare una nuova eccezione è sufficiente dichiarare una sottoclasse di Exception (o di una qualunque altra eccezione esistente), e ridefinire i costruttori. • Exception(): Crea un'eccezione. • Exception(String message): Crea un'eccezione specificando un messaggio diagnostico. Esempio di eccezione personalizzata: public class MiaEccezione extends Exception{ MiaEccezione (String messaggio) { super (messaggio); } } } 16/01/2013 Questa classe si deve trovare in un file chiamato come la classe, ovvero “MiaEccezione.java". 50 Come sollevare la nuova eccezione import java.io.*; public class UsaMiaEccezione { public static void main(String[] args) throws MiaEccezione, IOException { /* lista delle sottoclassi di Exception che possono essere lanciate dal metodo */ final int Min = 10, Max = 30; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Introduci un numero tra "+Min +" e " +Max+ " inclusi"); int valore = Integer.parseInt(br.readLine()); if (valore < Min || valore > Max) throw new MiaEccezione ("il valore non è nell'intervallo"); System.out.println("Non è stata lanciata l'eccezione"); } } 16/01/2013 51 Come sollevare la nuova eccezione import java.io.*; public class UsaMiaEccezione { public static void main(String[] args) throws MiaEccezione, IOException { /* lista delle sottoclassi di Exception che possono essere lanciate dal metodo */ final int Min = 10, Max = 30; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Introduci un numero tra "+Min +" e " +Max+ " inclusi"); int valore = Integer.parseInt(br.readLine()); if (valore < Min || valore > Max) throw new MiaEccezione ("il valore non è nell'intervallo"); System.out.println("Non è stata lanciata l'eccezione"); Quindi } con la clausola throws avviso il compilatore che questo metodo potrebbe lanciare questa tipologia di eccezione } Nel codice verifico se è il caso o no di lanciare l’eccezione in caso affermativo creo l’oggetto eccezione da lanciare (new..) e con l'istruzione throw lo lancio. 16/01/2013 52 Esercizio Data la classe Tempo di seguito riportata, modificarla in modo tale che se il metodo assegnaTempo riceve parametri errati, generi un'eccezione. 16/01/2013 53 Classe Tempo public class Tempo { protected int ore, minuti, secondi; static public char separatore = ':'; public Tempo () { // costruttore ore = minuti = secondi = 0; } 16/01/2013 54 Classe Tempo public Tempo (int ora, int minuto, int secondo) { // costruttore s(); assegnaTempo (ora, minuto, secondo); } public int assegnaTempo (int ora, int minuto, int secondo){ if (ora >= 0 && ora < 24 && minuto >= 0 && minuto < 60 && secondo >= 0 && secondo < 60 ){ ore = ora; minuti = minuto; secondi = secondo; return 0; } else return -1; } public int leggiOra () { return ore; } 16/01/2013 55 Classe Tempo public int leggiMinuti () { return minuti; } public int leggiSecondi () { return secondi; } public void aggiungiOre (int numOre) { ore = ore + numOre; while (ore > 23) ore = ore - 24; } public void visualizza (boolean ritornoACapo) { System.out.print("" + ore + separatore + minuti + separatore); 16/01/2013 56 Classe Tempo /* La stringa vuota ("") come argomento di System.out.print serve per forzare l'interpretazione di + come operatore di concatenazione di stringhe */ if (ritornoACapo) System.out.println (secondi); else System.out.print (secondi); } } 16/01/2013 57 Soluzione Estendiamo Tempo.java in modo che se il metodo assegnaTempo riceve parametri errati, genera un'eccezione. public class TempoConEccezioni extends Tempo{ public TempoConEccezioni() { super(); } public TempoConEccezioni (int ora, int minuto, int secondo) { super (ora, minuto, secondo); } public int assegnaTempo (int ora, int minuto, int secondo){ if (super.assegnaTempo(ora,minuto,secondo) == 0) return 0; else throw new TempoException("Errore in assegnatempo"); } 16/01/2013 58 Soluzione Definiamo la classe di eccezioni TempoException: public class TempoException extends RuntimeException{ public TempoException(){ super(); } public TempoException(String msg){ super(msg); } } 16/01/2013 59 Soluzione Proviamo la nuova classe con un semplice programma: public class UsaTempoConEccezioni{ public static void main(String [] args) { try { Tempo t = new TempoConEccezioni (99,99,99); t.visualizza(true); } catch (TempoException e) { System.out.println ("Errore:" + e); } } } 16/01/2013 60 Esercizio Modificare la classe Conto Corrente che nel caso l’importo da prelevare superi il saldo lanci una eccezione di IllegalArgumentException abbinata al seguente messaggio: ("somma non disponibile");} senza bloccare l’esecuzione del programma 16/01/2013 61 Soluzione public class ContoCorrente{ public static double preleva(double somma,double disp){ if(somma>disp) { throw new IllegalArgumentException("somma non disponibile");} disp=disp-somma; return disp;} public static void main(String[]args){ double disponibile = 2000.00; //denaro disponibile in CC Scanner sc= new Scanner(System.in); System.out.println("Somma disponibile in cc:" + disponibile); int termina = 1; 16/01/2013 62 Soluzione while(termina!=0) {System.out.println("Quale somma vuoi prelevare?"); double sommaDaPrelevare= sc.nextDouble(); try {disponibile = preleva(sommaDaPrelevare, disponibile);} catch(IllegalArgumentException) {System.out.println("Problema: "+ e +"prelevamento massimo: " + disponibile);} System.out.println("Somma disponibile in cc:" + disponibile); System.out.println("Digita 1 per continuare, 0 per uscire"); termina = sc.nextInt();}}} 16/01/2013 63 Esercizio Definire una classe cc che ha la funzione di una Calcolatrice che nel caso venga impostata una operazione non valida lanci una eccezione adeguata. Provare a gestire le eccezioni in modo che il programma non termini in modo anomalo 16/01/2013 64 public class cc { public cc(){} public double dividi( double op1, double op2) throws Exception { if( op2 == 0) {throw new Exception("Impossibile dividere per 0."); } return op1/op2; }} 16/01/2013 65 public class Calcolatrice { public static void main(String[] args) { try { cc calc = new cc(); double op1 = 3.2; double op2 = 0.0; double ris_divisione = calc.dividi( op1, op2 ); System.out.println(op1+" diviso "+op2+" fa: "+ris_divisione); } catch(Exception e) { System.out.println("La calcolatrice ha riportato una operazione non valida."+e);} }} 16/01/2013 66 16/01/2013 67 16/01/2013 68 Cosa abbiamo imparato? • Cosa sono le eccezioni:eventi anomali ed indesiderati che non permettono la normale prosecuzione del programma. • Le categorie di eccezioni e la differenza tra eccezioni: checked: controllate dal compilatore, sono tutte le sottoclassi della classe Exception e la loro gestione è obbligatoria; unchecked: libere da costrizioni programmative, sono tutte le sottoclassi della classe RuntimeException e la loro gestione è opzionale. Possono essere generate ovunque. • L’eccezione può essere: Propagata verso il metodo chiamante tramite la 16/01/2013 69 dichiarazione nel metodo throws; Catturata e gestita tramite il costrutto try/catch; Generata da un metodo tramite throw. • Come si utilizza la clausola throws: delega la gestione delle eccezioni che potrebbero essere sollevate da un metodo al metodo chiamante. • Che cos’è il costrutto try/catch: gestisce le eccezioni che potrebbero essere sollevate in un metodo all’interno del metodo stesso. - try contiene un’insieme di istruzioni che possono generare un’eccezione; - catch specifica quale eccezione si desidera gestire e quale istruzioni eseguire. E’ possibile ripetere più volte il blocco catch. 16/01/2013 70 • La clausola finally contiene un blocco di istruzioni da eseguire comunque dopo il blocco try. • Come si genera un’eccezione tramite l’istruzione throw. 16/01/2013 71 Questionario 1) Che cos’è un’eccezione? □ E’ un metodo particolare in Java; □ E’ un evento imprevisto, anomalo e indesiderato che non consente la normale prosecuzione del programma; □ E’ evento un previsto e desiderato che si utilizza in alcuni tipi di programmi; □ E’ una classe particolare in Java. 2)A cosa serve l’istruzione throws? □ throws serve per gestire un’eccezione unchecked; □ throws serve a dichiarare che in questo metodo potrebbero essere sollevate delle eccezioni di cui ne viene demandata la gestione al chiamante del metodo; □ throws serve a gestire le eccezioni che potrebbero essere sollevate in un metodo all’interno del metodo stesso; □ throws serve a generare un’eccezione. 16/01/2013 72 3)Che cos’è un’eccezione in Java? □ Una classe; □ Un oggetto; □ Un metodo; □ Un package. 4)A cosa servono le istruzioni try/carch? □ try/catch servono per gestire un’eccezione unchecked; □ try/catch servono a dichiarare che in questo metodo potrebbero essere sollevate delle eccezioni di cui ne viene demandata la gestione al chiamante del metodo; □ try/catch serve a gestire le eccezioni che potrebbero essere sollevate in un metodo all’interno del metodo stesso; □ try/catch serve a generare un’eccezione 5) ) Le eccezioni in Java, di quale istanza di classi fanno parte? □ delle classi java.lang.Exception e sue sottoclassi e di java.lang.RuntimeException e sue sottoclassi; 16/01/2013 73 □ delle classi java.io.Exception e sue sottoclassi □ delle classi java.error.Exceptione e sue sottoclassi e di java.error.RuntimeException e sue sottoclassi; □ delle classi java.io.Exceptione e sue sottoclassi e di java.io.RuntimeException e sue sottoclassi 6) Cosa significano le parole checked e unchecked e a quale classe fanno riferimento? □ checked sono eccezioni controllate che sono istanze della classe java.lang.Exception, mentre unchecked sono eccezioni non controllate e sono istanze della classe java.lang.RuntimeException; □ checked sono eccezioni non controllate che sono istanze della classe java.lang.Exception, mentre unchecked sono eccezioni controllate e sono istanze della classe java.lang.RuntimeException; □ checked sono eccezioni controllate che sono istanze della classe java.lang.RuntimeException, mentre unchecked sono eccezioni non controllate e sono istanze della classe java.lang.Exception;. 16/01/2013 74 □ checked sono eccezioni non controllate che sono istanze della classe java.lang.RuntimeException, mentre unchecked sono eccezioni controllate e sono istanze della classe java.lang.Exception 7)A cosa serve l’istruzione finally dopo un blocco try? □ il blocco finally è obbligatorio e contiene istruzioni che vengono comunque eseguite sia che sia stata che non sia stata sollevata un’eccezione; □ il blocco finally è facoltativo e contiene istruzioni che vengono comunque eseguite sia che sia stata che non sia stata sollevata un’eccezione; □ il blocco finally è facoltativo e contiene istruzioni che vengono eseguite solo se sia stata sollevata un’eccezione; □ il blocco finally è facoltativo e contiene istruzioni che vengono eseguite solo se non sia stata sollevata un’eccezione. 16/01/2013 75 8)Qual è la differenza tra le eccezioni checked e unchecked? □ Non c’è nessuna differenza sono entrambe libere da costrizioni programmative; □ Non c’è nessuna differenza sono entrambe controllate dal compilatore; □ Le eccezioni checked vengono controllate dal compilatore, mentre le eccezioni unchecked sono libere da costrizioni programmative; □ Le eccezioni checked sono libere da costrizioni programmative, mentre le eccezioni unchecked vengono controllate dal compilatore. 9)Quale dei seguenti costrutti per la gestione delle eccezioni è giusto? □ try{ istruzione1(); istruzione2();....} catch(Exception1 e1) { // gestione dell'eventuale problema nato nel blocco try} catch(Exception2 e2) { // gestione dell'eventuale problema nato nel blocco try}; 16/01/2013 76 □ finally{ // codice da eseguire comunque al termine del blocco try} try{ istruzione1(); istruzione2();....} catch(Exception1 e1) { // gestione dell'eventuale problema nato nel blocco try} catch(Exception2 e2) { // gestione dell'eventuale problema nato nel blocco try}; □ try{ istruzione1(); istruzione2();....} try{ istruzione1(); istruzione2();....} catch(Exception1 e1) { // gestione dell'eventuale problema nato nel blocco try}; 16/01/2013 77 □ try{ try{ istruzione1(); istruzione2();....} istruzione1(); istruzione2();....} catch(Exception1 e1) { // gestione dell'eventuale problema nato nel blocco try} catch(Exception2 e2) { // gestione dell'eventuale problema nato nel blocco try}; 10)Quale dei seguenti non è un modo per gestire le eccezioni? □ Un’eccezione può essere catturata e gestita all’interno di un metodo tramite il costrutto try/catch; □ Un’eccezione può essere generata all’interno di un metodo tramite il costrutto throw; □ Un’eccezione può essere generata all’interno di un metodo tramite il costrutto throws; 16/01/2013 78 □ Un’eccezione può essere propagata verso il metodo chiamante che può catturare e gestire l’eccezione o continuare la propagazione tramite la definizione del metodo throws. 11) Nel main, per gestire le eccezioni, quale tipo di costrutto viene utilizzato? □ try/catch; □ throws; □ throw; □ java.io.IOException. 12)Quale classe si trova in cima alla gerarchia delle eccezioni? □ Throwable; □ Error; □ Exception; □ Runtime Exception. 16/01/2013 79 13)Cosa succede se un’eccezione non viene intercettata? □ Nulla, il programma viene eseguito ugualmente ; □ Si verifica un’interruzione anomala del programma; □ Un’eccezione viene sempre intercettata dalla JVM; □ Il programma viene eseguito ma in maniera errata. 14)Quali sono le due dirette sottoclassi di Throwable? □ Exception e RuntimeException; □ Error e Exception; □ Error e RuntimeException; □ checked e unchecked. 15)Quali dei seguenti modi non può generare un’eccezione? □ Un’eccezione può essere generata esplicitamente con l’istruzione throws; □ Un’eccezione può essere generata da un errore nella JVM; □ Un’eccezione può essere generata da un errore nel programma; □ Un’eccezione può essere generata esplicitamente con l’istruzione throw. 16/01/2013 80