Laboratorio di reti I · Manuale pratico di Java, L. Bettini et al., HOPS Javadocs in rete (...

27
Laboratorio di reti I Stefano Brocchi [email protected]fi.it 13 ottobre, 2009 Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 1 / 27

Transcript of Laboratorio di reti I · Manuale pratico di Java, L. Bettini et al., HOPS Javadocs in rete (...

Laboratorio di reti I

Stefano [email protected]

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

Le eccezioni

Stefano Brocchi Laboratorio di reti I 13 ottobre, 2009 7 / 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