2 lucidi per pagina in formato pdf

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