View
220
Download
0
Category
Preview:
Citation preview
Laboratorio di reti I
Stefano Brocchibrocchi@dsi.unifi.it
13 ottobre, 2009
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 1 / 27
Introduzione
Obiettivi del corso
Aspetti di programmazione Java necessari alla programmazione di reti
Sviluppo di applicazioni di rete basate su tecnologia Java
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 2 / 27
Introduzione
Perche Java ?
Portabilita
JVM
Primitive orientate alla rete
Semplice accesso alla reteMultithreadingRemote Method Invocation
Integrazione con la rete
AppletServlet
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 3 / 27
Introduzione
Programma del corso
Concetti base di Java
Gestione degli errori tramite le eccezioniComunicazione: il pacchetto java.ioMultithreading
Programmazione di reti
Il pacchetto java.netIl linguaggio HTMLLe applet...?
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 4 / 27
Introduzione
Riferimenti bibliografici
Slide del corso
http://www.dsi.unifi.it/users/brocchi/labreti/insegnamento.php.htm(modulo 1)http://www.dsi.unifi.it/users/brocchi/labreti/insegnamento2.php.htm(modulo 2)
Thinking in Java, Bruce Eckel, distribuzione gratuita in rete dellaterza edizione
Java Network Programming, Hughes et al., Manning
Manuale pratico di Java, L. Bettini et al., HOPS
Javadocs in rete (http://java.sun.com/javase/6/docs/api/)
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 5 / 27
Introduzione
Modalita di esame
Progetto: sviluppare una piccola applicazione di rete
Discussione del progetto e orale
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 6 / 27
Le eccezioni
La problematica degli errori
E’ necessario gestire situazioni dove il flusso del programma non puoprocedere normalmente
Es. Divisione per zero, apertura di un file inesistente
Problema: spesso il contesto non dispone di abbastanza informazioniper poter gestire l’errore
Soluzione: rimandare il problema all’ambiente chiamante
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 8 / 27
Le eccezioni
Le eccezioni
Un approccio utilizzato (linguaggio C) e quello di ritornare unparticolare valore in caso di errore
Ogni chiamata a procedura dovrebbe essere seguita da un controllo dicorrettezza: codice poco chiaroCondizioni di errore spesso ignorate
Approccio Java: ogni errore viene rappresentato tramite un oggetto ditipo (o figlio di) Exception
In caso di una situazione di errore il metodo termina lanciandoun’eccezione invece di restituire il valore di ritorno standard
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 9 / 27
Le eccezioni Lanciare un’eccezione
Lanciare un’eccezione
Un’eccezione ha due costruttori di default, uno vuoto ed uno cheprende una stringa come parametro
Exception e = new Exception();
Exception e2 = new Exception("Messaggio di errore");
Il lancio di un’eccezione avviene tramite la parola chiave throw
if (t == null) {
throw new NullPointerException("T is null !");
}
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 10 / 27
Le eccezioni Lanciare un’eccezione
Gerarchia delle eccezioni
Esiste una vasta gerarchia di eccezioni in Java per i molteplici tipi dierrore.
Object
Throwable
Exception
ClassNotFoundException
IllegalAccesException
RuntimeException
IOException
IllegalArgumentException
IndexOutOfBoundsException
NullPointerException
FileNotFoundException
MalformedURLException
Figure: Gerarchia di alcune eccezioni in Java
Rivestono una particolare importanza le classi RuntimeException e lesue derivate
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 11 / 27
Le eccezioni Propagare un’eccezione
Propagare un’eccezione
Dopo l’esecuzione del comando throw la normale esecuzione delcodice si interrompe
Un metodo contenente codice che puo lanciare un’eccezione ha duepossibilita: gestirla o propagarla all’ambiente chiamante
Nel caso in cui il metodo propaghi l’eccezione al chiamante occorrespecificare questa possibilita nella firma del metodo tramite laclausola throws
public int MyMethod() throws IOException {
if (...) {
throw new IOException();
}
...
}
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 12 / 27
Le eccezioni Propagare un’eccezione
Propagare un’eccezione - eccezioni runtime
Fanno eccezione le eccezioni di tipo runtime (derivate daRuntimeException) dove la clausola throws non deve esserenecessariamente specificata
public int MyRuntimeMethod() {
if (...) {
throw new RuntimeException();
}
...
}
Se cosı non fosse alcune eccezioni, come la NullPointerException,dovrebbero essere dichiarate nella clausola throws di quasi ognimetodo
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 13 / 27
Le eccezioni Propagare un’eccezione
Propagare un’eccezione
Dal momento in cui un metodo puo sollevare un’eccezione tutti glialtri metodi che ne fanno uso devono a loro volta gestire o propagarel’eccezione.
public int MyMethod2() throws IOException {
MyMethod();
...
}
Se nessun metodo gestisce l’eccezione questa risale per tutto lo stackdelle chiamate fino ad arrivare alla JVM che termina l’esecuzione estampa il contenuto dello stack.
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 14 / 27
Le eccezioni Propagare un’eccezione
Propagare un’eccezione - esempio
Per esempio eseguendo la seguente classe...
public class propException {
public static void b() throws Exception {
throw new Exception("Eccezione di prova");
}
public static void a() throws Exception {
b();
}
public static void main (String[] args)
throws Exception {
a();
}
}
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 15 / 27
Le eccezioni Propagare un’eccezione
Propagare un’eccezione - esempio
... si ottiene il seguente messaggio di errore
Exception in thread "main" java.lang.Exception:
Eccezione di prova
at propException.b(propException.java:3)
at propException.a(propException.java:6)
at propException.main(propException.java:10)
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 16 / 27
Le eccezioni Gestire le eccezioni
Gestire le eccezioni
La gestione delle eccezioni avviene tramite il costrutto try...catch
try {
// Codice che puo generare eccezioni
} catch (TipoEccezione e) {
// Codice per gestire l’eccezione
}
Se un’istruzione nel blocco try genera un’eccezione del tipospecificato nel catch l’esecuzione passa immediatamente alle istruzioninel blocco catch
Le istruzioni nel blocco catch possono utilizzare l’oggetto eccezionegenerato (nell’esempio e)
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 17 / 27
Le eccezioni Gestire le eccezioni
Metodi di Exception
Alcuni metodi utili della classe Exception:
public void printStackTrace()
public void printStackTrace(PrintStream s)
Stampa una descrizione di dove l’eccezione e stata generata e deipunti dove e stata propagata
public String getMessage()
Restituisce il messaggio associato all’eccezione
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 18 / 27
Le eccezioni Gestire le eccezioni
Gestire le eccezioni
Se il codice nel corpo del try puo generare diversi tipi di eccezione sipossono inserire piu clausole catch:
try {
// Codice che puo generare eccezioni
} catch (FileNotFoundException e1) {
// Codice per gestire una FileNotFoundException
} catch (NullPointerException e2) {
// Codice per gestire una NullPointerException
} catch (IndexOutOfBoundsException e3) {
// Codice per gestire una IndexOutOfBoundsException
}
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 19 / 27
Le eccezioni Gestire le eccezioni
Gestire le eccezioni
Se un’eccezione che viene sollevata e compatibile con piu clausolecatch il codice ad essere eseguito e quello del primo catch
incontrato partendo dall’alto
try { ...
} catch (FileNotFoundException e1) {
// Codice per gestire una FileNotFoundException
} catch (IOException e2) {
// Codice per gestire una IOException
// che non sia una FileNotFoundException
} catch (Exception e3) {
// Codice per gestire una Exception
// che non sia una IOException
}
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 20 / 27
Le eccezioni Gestire le eccezioni
Rilanciare le eccezioni
Talvolta puo capitare di voler gestire alcune eccezioni e di volerneinvece propagare altre. Questo si puo ottenere utilizzando siacostrutti try...catch sia istruzioni throw
try { ...
} catch (FileNotFoundException e1) {
// Gestione della FileNotFoundException
} catch (IOException e2) {
...
throw e2;
// L’eccezione viene ’rilanciata’
// al metodo chiamante
}
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 21 / 27
Le eccezioni Gestire le eccezioni
Il blocco finally
E’ possibile specificare tramite il blocco finally delle istruzioni chesaranno eseguite comunque, che un’eccezione si verifichi o no.
try {
...
} catch (FileNotFoundException e) {
...
} finally {
// Codice che verra comunque eseguito
}
Utile per rilasciare delle risorse acquisite (per esempio per chiudereuna connessione)
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 22 / 27
Le eccezioni Estendibilita
Eccezioni ed estendibilita
Riscrivendo un metodo con clausole throws in una sottoclasse eproibito lanciare eccezioni che non potevano essere lanciate dalmetodo della sovraclasse
In questo modo sostituendo un oggetto ad uno meno specializzatotutto continua a funzionare correttamente (principio dellaprogrammazione ad oggetti)
E’ possibile creare le proprie eccezioni estendendo la classeException o le sue derivate
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 23 / 27
Le eccezioni Eccezioni checked ed unchecked
Eccezioni checked e unchecked
Tutte le eccezioni di tipo diverso da RuntimeException si diconochecked, in quanto la loro gestione deve essere gestita esplicitamente
Se un’eccezione non viene gestita ed il metodo non ne dichiara lapropagazione si ottiene un errore in fase di compilazione: Java cercadi costringerci a creare del codice robusto
Evitare assolutamente di far sparire le eccezioni:
try {
...
} catch (Exception e) { }
Le eccezioni a runtime si dicono invece unchecked e sfuggono aquesto meccanismo di controllo in fase di compilazione
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 24 / 27
Le eccezioni Esercizio
Esercizio
Scrivere una classe che, ricevendo in ingresso una lista di interi comeparametri, stampi il risultato della divisione intera del primo per ilsecondo, del terzo per il quarto, e cosı via
Es. java esercizio 6 3 7 2 12 4 deve restituire
6 / 3 = 2
7 / 2 = 3
12 / 4 = 3
Se un divisore e zero il programma deve dare come output ad es. 5 /
0 -> Infinite
In caso una stringa in ingresso non corrisponda ad un intero ilprogramma deve stampare un messaggio di errore e terminare
Se il numero di parametri e dispari il programma deve terminarelanciando una OddParametersException (da creare estendendoun’opportuna eccezione) e segnalando l’errore con un messaggio
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 25 / 27
Le eccezioni Esercizio
Esercizio
Implementare (almeno) due metodi: un main ed un metodo chescorra i parametri e ne esegua la divisione
Gestire la divisione per zero tramite eccezioni (non controllare primadell’operazione che il divisore sia diverso da zero)
La trasformazione da stringa ad intero puo essere fatta con il metodopublic int Integer.parseInt(String s)
Questo lancia una NumberFormatException se la stringa argomentonon rappresenta un intero
In caso di interruzione del programma a fronte dei vari errori,implementare per alcuni un meccanismo dove l’eccezione vienepropagata fino alla JVM e per altri un modo per intercettarla e dareun messaggio definito nel codice
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 26 / 27
Le eccezioni Esercizio
Esercizio
Alternativamente, nel caso di un parametro non intero stampare unmessaggio di errore ma invece di terminare procedere ignorando ilvalore errato
In questo caso lanciare una OddParametersException solo se ilnumero di parametri corretti e dispari
Scrivere la seconda versione dell’esercizio riutilizzando piu possibile ilcodice realizzato per la prima; fare cosı in modo che le differenze tra idue codici siano minimali
Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 27 / 27
Recommended