23/10/14 ECCEZIONI Teoria GESTIONE DEGLI ERRORI • Spesso vi sono istruzioni “cri0che”, che in cer0 casi possono produrre errori. • L’approccio classico consiste nell’inserire controlli (if… else..) per cercare di interce>are a priori le situazioni cri0che. • Ma è un modo di procedere spesso insoddisfacente perché non è facile prevedere tu>e le situazioni che potrebbero produrre l’errore. • Ges;re l’errore spesso significa solo stampare a video un messaggio. STRUMENTI JAVA PER LO SVILUPPO DI INTERFACCE UTENTE E SERVIZI DI RETE E LORO APPLICAZIONE 1 23/10/14 Teoria Java introduce il conce>o di eccezione. • Anziché tentare di prevedere le situazioni di errore, si tenta di eseguire l’operazione in un blocco controllato. • Se si produce un errore, l’operazione solleva un’eccezione. • L’eccezione viene caDurata dal blocco entro cui l’operazione è eseguita… • …e può essere ges;ta nel modo più appropriato. STRUMENTI JAVA PER LO SVILUPPO DI INTERFACCE UTENTE E SERVIZI DI RETE E LORO APPLICAZIONE Teoria try { //operazione critica che può sollevare eccezioni } catch (Exception1 e1) { //gestione dell’eccezione di tipo Exception1 } catch (Exception2 e2) { //gestione dell’eccezione di tipo Exception2 } finally { //codice da eseguire comunque dopo il blocco try } • Se l’operazione solleva diversi ;pi di eccezione in risposta a diversi ;pi di errore, più blocchi catch possono seguire lo stesso blocco try STRUMENTI JAVA PER LO SVILUPPO DI INTERFACCE UTENTE E SERVIZI DI RETE E LORO APPLICAZIONE 2 23/10/14 Esempio 1: try/catch CONVERSIONE STRINGA !NUMERO In Java la conversione stringaànumero intero è svolta dal metodo sta0co int Integer.parseInt(String s) • L’operazione è cri;ca, perché può avvenire solo se la stringa data con;ene la rappresentazione di un numero intero. • Se ciò non accade il metodo parseInt solleva una eccezione NumberFormatException STRUMENTI JAVA PER LO SVILUPPO DI INTERFACCE UTENTE E SERVIZI DI RETE E LORO APPLICAZIONE Esempio 1: try/catch public class NumeroIntero { public static void main(String[] args) { int numero = 0; String n = "ciao"; try { numero = Integer.parseInt(n); } catch (NumberFormatException e) { System.out.println("Errore: stringa mal fatta."); System.exit(-1); } System.out.println("Il numero inserito è " + numero); } } STRUMENTI JAVA PER LO SVILUPPO DI INTERFACCE UTENTE E SERVIZI DI RETE E LORO APPLICAZIONE 3 23/10/14 Esempio 1: try/catch public class NumeroIntero { Catturare le eccezioni è importante: non catturata siargs) propaga{verso public static un’eccezione void main(String[] l’esterno, di blocco in blocco: se raggiunge il int numero = 0; main, provoca l’aborto del programma String n = "ciao"; try { numero = Integer.parseInt(n); } catch (NumberFormatException e) { System.out.println("Errore: stringa mal fatta."); System.exit(-1); } System.out.println("Il numero inserito è " + numero); } } STRUMENTI JAVA PER LO SVILUPPO DI INTERFACCE UTENTE E SERVIZI DI RETE E LORO APPLICAZIONE Le eccezioni: cosa sono? • Una eccezione è un oggeDo, istanza di java.lang.Throwable o di una sua so>oclasse. Le due so>oclassi più comuni sono: – java.lang.Exception Indica situazioni recuperabili, almeno in linea di principio (fine file, indice di un array oltre i limi0, errori di input, etc.): va caDurata e ges;ta. – java.lang.Error Indica problemi rela0vi al caricamento della classe o al funzionamento della macchina virtuale Java (es. not enough memory), e va considerato irrecuperabile: perciò non è da caDurare. • La parola “eccezione” è però spesso riferita a entrambe. STRUMENTI JAVA PER LO SVILUPPO DI INTERFACCE UTENTE E SERVIZI DI RETE E LORO APPLICAZIONE 4 23/10/14 Le eccezioni: cosa sono? • Poiché un’eccezione è un oggeDo, può contenere da0 o definire metodi. • Tu>e le eccezioni definiscono un metodo getMessage() che res0tuisce il messaggio d’errore associato • Alcune eccezioni definiscono dei campi da0 (ad esempio, bytesTransferred in InterruptedIOException) che danno altre informazioni, u0li per ges0re la situazione. STRUMENTI JAVA PER LO SVILUPPO DI INTERFACCE UTENTE E SERVIZI DI RETE E LORO APPLICAZIONE Come ges;rle? Un metodo che possa generare un’eccezione deve svolgere una di queste due azioni: • ges;re l’eccezione, con un costru>o try / catch oppure • rilanciarla esplicitamente all’esterno del metodo, delegandone in pra0ca la ges0one ad altri. Se sceglie questa seconda strada, il metodo deve indicare quale eccezione può “uscire” da esso, con la clausola throws Ad esempio, un metodo che svolga una conversione stringa>numero, anziché ges;re la NumberFormatExcep;on Non la gestisce, può decidere di rilanciarla all’esterno: public int readInteger(String s) throws NumberFormatException { return Integer.parseInt(s); } la rilancia all’esterno Può sollevare un’eccezione STRUMENTI JAVA PER LO SVILUPPO DI INTERFACCE UTENTE E SERVIZI DI RETE E LORO APPLICAZIONE 5 23/10/14 Definire nuove eccezioni Dato che un’eccezione è un normale ogge>o, è possibile: • definire nuovi ;pi di eccezione definendo nuove classi • generare eccezioni dall’interno di propri metodi. Per definire un nuovo 0po di eccezione basta definire una nuova classe che estenda la classe base Exception (o una delle sue so>oclassi) STRUMENTI JAVA PER LO SVILUPPO DI INTERFACCE UTENTE E SERVIZI DI RETE E LORO APPLICAZIONE Esempio 2: throws Supponiamo che il metodo readInteger debba “res0tuire errore” nel caso in cui il numero da conver0re sia maggiore di 100. L’eccezione da lanciare è IllegalArgumentException. Per sollevare (generare) un’eccezione: • prima si crea l’oggeDo eccezione da lanciare • poi lo si lancia con l’istruzione throw public int readInteger(String s) throws NumberFormatException, IllegalArgumentException { int x = Integer.parseInt(s); if (x>100) throw new IllegalArgumentException(); return x; } STRUMENTI JAVA PER LO SVILUPPO DI INTERFACCE UTENTE E SERVIZI DI RETE E LORO APPLICAZIONE 6 23/10/14 Esempio 2: throws Supponiamo che il metodo readInteger debba “res0tuire errore” nel caso Importante non in cui il numero da cconfondere: onver0re sia maggiore di 100. L’eccezione da lanciare è • IllegalArgumentException la clausola throws che dichiara che un metodo rilancia all’esterno un’eccezione Per • sl’istruzione ollevare (generare) n’eccezione: throw uche solleva un’eccezione • prima si crea l’oggeDo eccezione da lanciare • poi lo si lancia con l’istruzione throw Questa è l’eccezione che può essere sollevata da parseInt public int readInteger(String s) throws NumberFormatException, IllegalArgumentException { int x = Integer.parseInt(s); if (x>100) throw new IllegalArgumentException(); return x; } STRUMENTI JAVA PER LO SVILUPPO DI INTERFACCE UTENTE E SERVIZI DI RETE E LORO APPLICAZIONE Esercizio Creare una classe per la conversione stringa>numero intero. La conversione deve essere limitata all’intervallo [-­‐10, 10], nel caso il numero sia fuori dall’intervallo deve essere lanciata l’eccezione IllegalArgumentException passando come argomento un messaggio d’errore per l’utente. Il costru>ore della classe deve lanciare tu>e le eventuali eccezioni che devono essere ca>urate dal main. Il parametro da conver0re deve essere dato in ingresso al main. Verificare la ges0one delle eccezioni passando: un intero nell’intervallo, un intero al di fuori di esso, una stringa. STRUMENTI JAVA PER LO SVILUPPO DI INTERFACCE UTENTE E SERVIZI DI RETE E LORO APPLICAZIONE 7 23/10/14 Soluzione //Creo la classe e il costru>ore (file Esercizio1.java) public class Esercizio1 { /** Il costruttore. */ public Esercizio1(String[] args) throws NumberFormatException,IllegalArgumentException { String numero = args[0]; int num = Integer.parseInt(numero); if((num<-10) || (num>10)) throw new IllegalArgumentException("Fuori dall’intervallo"); System.out.println("Numero: " + num); } } STRUMENTI JAVA PER LO SVILUPPO DI INTERFACCE UTENTE E SERVIZI DI RETE E LORO APPLICAZIONE Soluzione //file Main.java public class Main{ public static void main(String[] args) { try { Esercizio1 oggetto = new Esercizio1(args); } catch(NumberFormatException e1) { System.out.println("Format Exception 1:" +e1.getMessage()); //messaggio predefinito } catch(IllegalArgumentException e2) { System.out.println("Format Exception 2:" +e2.getMessage()); //messaggio definito in Esercizio1 } } } STRUMENTI JAVA PER LO SVILUPPO DI INTERFACCE UTENTE E SERVIZI DI RETE E LORO APPLICAZIONE 8