Eccezioni Metodi parziali Eccezioni: Usi e Metodi parziali Eccezioni: rimuovere i requires Eccezioni: rimuovere i requires Eccezioni: definizione, sollevamento, gestione Eccezioni: definizione, sollevamento, gestione Cattura: mascheramento o riflessione Cattura: mascheramento o riflessione Eccezioni: regole d’uso Eccezioni: regole d’uso Defensive programming : Checked vs. Unchecked Esempi: fattoriale, LList, compressione di files Esempi: fattoriale, LList, compressione di files
Eccezioni: usi Funzioni parziali domini Gestione di eventi Gestione di eventi thread e concorrenza Catastrofi errori incontrollabili Scopo: Garantire una terminazione “regolare” del programma (stato finale appartiene agli stati consentiti per la terminazione)
Metodi parziali Tre cause principali: Realizza funzione parziale fattoriale Implementazione utilizza funzioni parziali algoritmi di ricerca (possono richiedere strutture ordinate) Strutture sovradimensionate per lo spazio dei valori del dominio fattoriale: Naturali invece di interi
Eccezioni: rimuovere i requires Eccezioni: –Non sono speciali valori del dominio di definizione del metodo parziale –Sono trattabili come fossero valori di un dominio particolare del linguaggio –In JAVA formano una gerarchia di classi Throwable Error RuntimeExceptionunchecked Exceptions Class ClasscheckedClasschecked NullPointerExceptionClassCastException
Eccezioni: definizione, sollevamento, gestione Introducono: come normali valori oggetto new A_ExceptionClass(…) // un valore eccezione checkednew A_ExceptionClass(…) // un valore eccezione checked new NullPointerException(“insert”) // un valore eccezione uncheckednew NullPointerException(“insert”) // un valore eccezione unchecked Definiscono: gerarchia di classe Exception public class NoIntegerException extends Exception{ //OVERVIEW: contiene eccezioni che segnalano uso, come oggetti Integer, // di oggetti che non hanno Integer come superclasse public NoIntegerException(){ super(); } public NoIntegerException(String s){ super(s); } } Spesso non hanno stato
Eccezioni: come si usano? come valoricome valori A_ExceptionClass e; // una variabile x e = new A_ExceptionClass (…) // un assegnamento in metodi che le possono sollevarein metodi che le possono sollevare void luigi (object x) throws A_ExceptionClass {…}// un metodo public int fact (int x) throws NegativeInt {…}// un metodo gestiti:gestiti: –Cattura –Mascheramento –Risollevamento
Cattura: Mascheramento o Riflessione Cattura:Cattura: –Sia C un blocco che può sollevare un’eccezione di classe A –try {C} catch (A v) {..trattamento eccezione associata a v..} Mascheramento: eccezione è risolta eccezione è risolta blocco calcola valore non eccezione blocco calcola valore non eccezioneRiflessione: eccezione non è risolta eccezione non è risolta blocco risolleva tale eccezione blocco risolleva tale eccezione Oppure solleva una nuova eccezione Oppure solleva una nuova eccezione Sollevare eccezione richiede il costrutto Sollevare eccezione richiede il costrutto throw expr dove expr ha valore un’eccezione dove expr ha valore un’eccezione
Eccezioni: regole d’uso (Implementazione di una parziale) 1.Uso locale - funz. privata di una classe a)Lasciamo la clausola requires b)Verifichiamo che nessun uso violi i requires (la verifica è possibile) 2.Uso non locale - funz. pubblica del sistema a)Rimuoviamo la clausola requires b)Introduciamo opportuna classe Exception (se non presente) c)Equipaggiamo il metodo con controlli sull’imput e con sollevamento di eccezione in violazione d)Consideriamo ogni uso (nel sistema) del metodo per cattura- mascheramento-riflessione
ogni procedura controlla di non generare errori Defensive Programming ogni procedura controlla di non generare errori Checked:Checked: Introdotte nel programma --poste in un package dedicatoIntrodotte nel programma --poste in un package dedicato –Mediante classi della gerarchia obbligatorio dichiarare ogni metodo che le può sollevareobbligatorio dichiarare ogni metodo che le può sollevare –Mediante: …. throws ExceptionClass… Vantaggio: gestione esplicita dell’eccezione -- mascheramentoVantaggio: gestione esplicita dell’eccezione -- mascheramento Uso suggerito: metodi parziali in contesto non localeUso suggerito: metodi parziali in contesto non locale Unchecked:Unchecked: Introdotte nei pakages di linguaggioIntrodotte nei pakages di linguaggio Nessun obbligo di dichiarare metodi che le sollevanoNessun obbligo di dichiarare metodi che le sollevano Vantaggio: gestione automatica -- riflessioneVantaggio: gestione automatica -- riflessione Uso suggerito:Uso suggerito: »metodi parziali in contesto locale (o non) ma eccezione non sollevabile -- invocazioni possibili non la provocano »catastrofi -- comportamento non previsto e inatteso
Esempio: Eccezioni in Fact public class Fattoriale{ //overview: //overview: una classe per la procedura stand_alone fatt che calcola la funzione fattoriale public static int fact(int n) throws NegativeIntException{ //Effects: //Effects: se n = 0 calcola 1, se n>0 calcola n*fact(n-1), altrimenti solleva un // eccezione NegativeIntException if (n < 0) throw new NegativeIntException(”Fattoriale:fact”); if (n == 0) return 1; return n*fact(n-1);} } public class NegativeIntException extends Exception{ //overview: //overview: una classe per eccezioni su interi negativi public NegativeIntException(String s){ //Effects: //Effects: costruisce un eccezione sollevata in un contesto s super(s);} }
Esempio: Eccezioni in Fact - 2 public class Fattoriale{ //overview: //overview: una classe per la procedura stand_alone fatt che calcola la funzione fattoriale public static int fact(int n) throws NegativeIntException{ //Effects: //Effects: se n = 0 calcola 1, se n>0 calcola n*fact(n-1), altrimenti solleva un // eccezione NegativeIntException specificando il valore errato if (n < 0) throw new NegativeIntException(”Fattoriale:fact”, n); if (n == 0) return 1; return n*fact(n-1);} } public class NegativeIntException extends Exception{ //overview: //overview: una classe per eccezioni su interi negativi che tiene traccia del valore errato private Int val; public NegativeIntException(String s, Int n){ //Effects: //Effects: costruisce un’eccezione sollevata in un contesto s con valore n super(s); val=n;} public Int value(){ //Effects: //Effects: restituisce il valore errato return val;} }
Esempio: LList public class LList { private Link first; private class Link { Object data; Link next; } … public Object getFirst() { if (first == null) return null; else return first.data; } … public void addFirst(Object obj) { Link newLink = new Link(); newLink.data = obj; newLink.next = first; first = newLink; } … public class LList{ //overview: //overview: … //---stato: oggetti-classe public Object getFirst() throws EmptyListException{ //Effects: //Effects: se this è empty solleva eccezione, altrimenti restituisce // il primo elemento di this. if (first == null) throw new EmptyListException(); … public void addFirst(Object obj) throws NullPointerException{ //Effects: //Effects: se Obj è null solleva eccezione, altrimenti …. if (obj == null) throw new NullPointerException(); … public class EmptyListException extends Exception{ //overview: //overview: una classe per eccezioni su LList public EmptyListException(){ //Effects: //Effects: costruisce un’eccezione di tipo EmptyListExeption } public class NullPointerException extends RunTimeException{ //overview: //overview: una classe per eccezioni su oggetti null public NullPointerException(){ Effects //Effects: costruisce un’eccezione NullPointerException }
Esempio: Compress(Fin,Fout) public class Compress{ //OVERVIEW: contiene la procedura compress. public static void compress(File FIn, File FOut) throws UndefFileException, IllegalSymbol, FileNotFoundException{ //MODIFIES: FOut //EFFECTS: Se FIn o FOut è null solleva un’eccezione della nuova classe UndefFileException, sottoclasse di Exception, con // testo: "compress:argK" (con K=1 o K=2, rispetttivamente). Se FIn o FOut non sono nomi di file solleva eccezione prede- // finita FileNotFoundException. Altrimenti, fintanto che legge da FIn sequenze di lettere su più linee, le filtra (eliminando gli // spazi in eccesso) preservando la disposizione in linee. Allorché incontri un carattere non lecito (non lettera, non speciali "\b", // "\n”), termina chiudendo il file FOut e sollevando un'eccezione della nuova classe IllegalSymbolException, sottoclasse di // Exception, con testo: "compress:C (con C il carattere illegale letto). BufferedReader FInBuff if (Fin == null) then throw (new UndefFileException(“compress: arg1”));} try{FInBuff = OpenReader(FIn);}catch(FileNotFoundException e){throw (new FileNotFoundException(“compress: arg1”));} PrintStream FOutPrinter = OpenPrinter(FOut); // ---- specifica violata: modificare qui while (true) {String line; try { line = FInBuff.readLine(); } catch (java.io.IOException e) {return; } if (line == null) {return; } else {String out; try { out = Filter(line); } catch (IllegalSymbol e) { FOutPrinter.println(e.line); throw (new IllegalSymbol(e.symbol)); } FOutPrinter.println(out); FOutPrinter.flush(); }}} private static BufferedReader OpenReader(File FIn) throws UndefFileException, FileNotFoundException { //EFFECTS:.. private static PrintStream OpenPrinter(File FOut) throws UndefFileException, FileNotFoundException { //EFFECTS:.. private static String Filter(String line) throws IllegalSymbolException { //EFFECTS:..