15/02/2005 Programmazione Orientata agli Oggetti in Linguaggio Java Eccezioni: Conclusioni versione 2.0 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina) G. Mecca – Università della Basilicata – [email protected] Eccezioni: Conclusioni >> Sommario Sommario m Riepilogo m Evoluzione del Linguaggio m Eccezioni ðTrasformare le Eccezioni ðDefinire Nuove Eccezioni G. Mecca - Programmazione Orientata agli Oggetti 2 1 15/02/2005 Eccezioni: Conclusioni >> Riepilogo Riepilogo m Qualità del codice ðè un obiettivo fondamentale di questo corso ðcorretta impostazione metodologica m Le qualità da perseguire ðcorrettezza ðusabilità ðmanutenibilità ðefficienza 3 G. Mecca - Programmazione Orientata agli Oggetti Eccezioni: Conclusioni >> Riepilogo Riepilogo m Il ATTENZIONE a come cambia il processo di sviluppo processo di sviluppo discusso finora ðè centrato sulla corretta attribuzione delle responsabilità che garantisce buona organizzazione m La nuova linea guida ðadottare uno stile di programmazione difensiva G. Mecca - Programmazione Orientata agli Oggetti 4 2 15/02/2005 Eccezioni: Conclusioni >> Riepilogo Riepilogo m Programmazione difensiva ðper ciascun metodo, valutare le precondizioni e in caso di possibili condizioni eccezionali lanciare le corrispondenti eccezioni ðnegli schermi, effettuare sistematicamente la convalida dei dati dell’utente e le verifiche necessarie prima di chiamare i metodi G. Mecca - Programmazione Orientata agli Oggetti 5 Eccezioni: Conclusioni >> Evoluzione del Linguaggio Evoluzione del Linguaggio m In questo modulo ðuna nuova parola chiave del linguaggio: assert ðin precedenza, la parola chiave enum ðsi tratta di forme di evoluzione del linguaggio ðentrambe richiedono di utilizzare l’opzione – source del compilatore m Di seguito ðriassumiamo le principali evoluzioni viste G. Mecca - Programmazione Orientata agli Oggetti 6 3 15/02/2005 Eccezioni: Conclusioni >> Evoluzione del Linguaggio Evoluzione del Linguaggio m J2SE 1.2 ðnotevoli modifiche nei package fondamentali (es: java.util, java.io) rispetto a Java 1.1 ðma non cambia significativamente la sintassi rispetto a quella di Java 1.1 m J2SE 1.3 ðsostanzialmente identico a J2SE 1.2 ðcresce il numero di classi e di package delle API G. Mecca - Programmazione Orientata agli Oggetti 7 Eccezioni: Conclusioni >> Evoluzione del Linguaggio Evoluzione del Linguaggio m J2SE 1.4 ðalcune modifiche importanti nei package fondamentali (es: java.nio, gestione di XML: JAXP) ðnuova funzionalità: asserzioni; parola chiave assert m Nuovo livello dei sorgenti ðl’opzione -source 1.4 abilita le asserzioni G. Mecca - Programmazione Orientata agli Oggetti 8 4 15/02/2005 Eccezioni: Conclusioni >> Evoluzione del Linguaggio Evoluzione del Linguaggio m J2SE 1.5 – 5.0 ðnumerosi cambiamenti nelle API ðnumerosi cambiamenti significativi nel linguaggio (tipi generici, boxing ed unboxing automatico, ...) ðenumerazioni; nuova parola chiave enum m Nuovo livello dei sorgenti ðl’opzione –source 1.5 abilita le enumerazioni ðnota: le asserzioni sono sempre abilitate G. Mecca - Programmazione Orientata agli Oggetti 9 Eccezioni: Conclusioni >> Eccezioni Eccezioni m Nei metodi per la persistenza ðè necessario lavorare con varie eccezioni ðcontrollate e non controllate m Eccezioni controllate ðestendono java.lang.Exception m Eccezioni non controllate ðestendono java.lang.RuntimeException m Esistono ulteriori ramificazioni G. Mecca - Programmazione Orientata agli Oggetti 10 5 15/02/2005 Eccezioni: Conclusioni >> Eccezioni Eccezioni m Esempio: java.io.FileNotFoundException java.lang.Object java.lang.Throwable java.lang.Exception java.io.IOException java.io.FileNotFoundException G. Mecca - Programmazione Orientata agli Oggetti 11 Eccezioni: Conclusioni >> Eccezioni Eccezioni m Attenzione all’uso della clausola catch ðil polimorfismo interferisce con la cattura delle eccezioni m La regola ðun’eccezione viene catturata dal primo blocco catch il cui riferimento è compatibile con il tipo dell’eccezione ðl’eccezione potrebbe essere compatibile con più clausole catch G. Mecca - Programmazione Orientata agli Oggetti 12 6 15/02/2005 Eccezioni: Conclusioni >> Eccezioni Eccezioni m Esempio ðcaricamento dei dati dello studente m Una prima versione standard ðcrea un BufferedReader da un FileReader ðcattura le eccezioni e le stampa sullo schermo G. Mecca - Programmazione Orientata agli Oggetti 13 Eccezioni: Conclusioni >> Eccezioni public static Studente carica(String nomeFile) { Studente studente = new Studente(); java.io.BufferedReader flusso = null; try { java.io.FileReader fileReader = new java.io.FileReader(nomeFile); flusso = new java.io.BufferedReader(fileReader); estraiDatiStudente(studente, flusso); } catch (java.io.FileNotFoundException fnfe) { System.out.println(fnfe); } catch (java.io.IOException ioe) { System.out.println(ioe); } finally { try { if (flusso != null) { flusso.close(); } } catch (java.io.IOException ioe) {} } return studente; } G. Mecca - Programmazione Orientata agli Oggetti 14 7 15/02/2005 Eccezioni: Conclusioni >> Eccezioni Eccezioni m Alcune annotazioni ði due blocchi catch devono essere esattamente nell’ordine specificato, altrimenti il secondo diventa inutile ðFileNotFoundException viene intercettato dal primo blocco ðma la soluzione vista è decisamente migliorabile G. Mecca - Programmazione Orientata agli Oggetti 15 Eccezioni: Conclusioni >> Eccezioni Eccezioni m Primo miglioramento ðnon vengono effettivamente catturate tutte le eccezioni che possono verificarsi durante il caricamento (es: NumberFormatException, NullPointerException) ðI alternativa: specificare un blocco catch per ciascuna ðII alternativa: considerarle tutte equivalenti se non per il messaggio che portano e per la conseguenza: non è possibile caricare il file G. Mecca - Programmazione Orientata agli Oggetti 16 8 15/02/2005 Eccezioni: Conclusioni >> Eccezioni Eccezioni m In questo caso ðla seconda alternativa sembra migliore ðposso pensare di catturare tutte le possibili eccezioni indistintamente con un blocco del tipo catch (Exception e) {...} try { java.io.FileReader fileReader = new java.io.FileReader(nomeFile); flusso = new java.io.BufferedReader(fileReader); estraiDatiStudente(studente, flusso); } catch (Exception e) { ... } finally { ... } G. Mecca - Programmazione Orientata agli Oggetti 17 Eccezioni: Conclusioni >> Eccezioni Eccezioni m Attenzione ðquesto vale solo se le diverse eccezioni devono essere gestite allo stesso modo ðe se sono molte ðil vantaggio è che il codice si snellisce (si evitano molti blocchi catch) ðma lo svantaggio è che diventa meno leggibile e c’è meno controllo sul tipo di eccezioni che viaggiano G. Mecca - Programmazione Orientata agli Oggetti 18 9 15/02/2005 Eccezioni: Conclusioni >> Eccezioni Eccezioni m Secondo miglioramento ðnon sembra particolarmente efficace stampare l’eccezione in quel punto ðl’eccezione dovrebbe essere più appropriatamente gestita dal controllo ðvisto che si tratta di un evento decisamente importante per il prosieguo dell’applicazione ðil metodo potrebbe farsi attraversare dall’eccezione G. Mecca - Programmazione Orientata agli Oggetti 19 Eccezioni: Conclusioni >> Eccezioni Eccezioni m Terzo miglioramento ðsarebbe opportuno trasformare l’eccezione prima di rilanciarla al controllo ðin modo che il controllo non debba preoccuparsi di dettagli relativi ai file ðma sappia semplicemente che c’è stato un problema sulla persistenza ðutile per disaccoppiare il controllo dalla tecnologia specifica della persistenza G. Mecca - Programmazione Orientata agli Oggetti 20 10 15/02/2005 Eccezioni: Conclusioni >> Eccezioni Trasformare le Eccezioni m In concreto ðquesto è fattibile dichiarando una nuova classe di eccezione ðPersistenceException ðin it.unibas.mediapesata.modello ðun semplice “involucro” per incapsulare eccezioni diverse verificatesi durante il caricamento G. Mecca - Programmazione Orientata agli Oggetti 21 Eccezioni: Conclusioni >> Eccezioni public static Studente carica(String nomeFile) throws PersistenceException { Studente studente = new Studente(); java.io.BufferedReader flusso = null; try { java.io.FileReader fileReader = new java.io.FileReader(nomeFile); flusso = new java.io.BufferedReader(fileReader); estraiDatiStudente(studente, flusso); caricaEsami(studente, flusso); } catch (Exception e) { throw new PersistenceException(e); } finally { try { if (flusso != null) { flusso.close(); } } catch (java.io.IOException ioe) {} } return studente; } G. Mecca - Programmazione Orientata agli Oggetti 22 11 15/02/2005 Eccezioni: Conclusioni >> Eccezioni package it.unibas.mediapesata.controllo; public class Principale { private Studente schermoCaricaDati() { System.out.println("---------------------------------"); System.out.println(" Caricamento Dati"); System.out.println("---------------------------------"); System.out.print("Inserisci il nome del file --> "); String nomeFile = it.unibas.utilita.Console.leggiStringa(); Studente studente = null; try { studente = Studente.carica(nomeFile); System.out.println(" -- Caricamento effettuato -- "); } catch (PersistenceException ioe) { System.out.println("ERRORE: " + ioe); } return studente; } } 23 G. Mecca - Programmazione Orientata agli Oggetti Eccezioni: Conclusioni >> Eccezioni new FileReader(nomeFile) Trasformare le Eccezioni ... Studente Studente studente = Studente.carica(nomeFile) : Principale java.io.FileNotFoundException PersistenceException new : FileNotFoundException new : PersistenceException interfaccia e controllo new : Studente modello e persistenza G. Mecca - Programmazione Orientata agli Oggetti 24 12 15/02/2005 Eccezioni: Conclusioni >> Eccezioni Integer.parseInt(linea); Trasformare le Eccezioni ... Studente Studente studente = Studente.carica(nomeFile) : Principale java.lang.NumberFormatExce PersistenceException new : NumberFormatExcept new : PersistenceException interfaccia e controllo new : Studente modello e persistenza G. Mecca - Programmazione Orientata agli Oggetti 25 Eccezioni: Conclusioni >> Eccezioni Definire Nuove Eccezioni m La definizione di PersistenceException ðsi tratta di un nuovo tipo di eccezione non previsto dalle API di Java ðscelgo che sia un’eccezione controllata ðestende java.lang.Exception ðeredita la proprietà message ðè necessario definire esclusivamente i costruttori G. Mecca - Programmazione Orientata agli Oggetti 26 13 15/02/2005 Eccezioni: Conclusioni >> Eccezioni package it.unibas.appuntamenti.modello; public class PersistenceException extends Exception { public PersistenceException() { super(); } public PersistenceException(String s) { super(s); } public PersistenceException(Exception e) { super(e); } } G. Mecca - Programmazione Orientata agli Oggetti 27 Eccezioni: Conclusioni >> Sommario Riassumendo m Riepilogo m Evoluzione del Linguaggio m Eccezioni ðTrasformare le Eccezioni ðDefinire Nuove Eccezioni G. Mecca - Programmazione Orientata agli Oggetti 28 14 15/02/2005 Termini della Licenza Termini della Licenza m This work is licensed under the Creative Commons AttributionShareAlike License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/1.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. m Questo lavoro viene concesso in uso secondo i termini della licenza “Attribution-ShareAlike” di Creative Commons. Per ottenere una copia della licenza, è possibile visitare http://creativecommons.org/licenses/by-sa/1.0/ oppure inviare una lettera all’indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. G. Mecca - Programmazione Orientata agli Oggetti 29 15