Sei sulla pagina 1di 50

Luciano Carlotti

Programmazione Java Lab. Informatica 4AIF

Eccezioni
Luciano Carlotti

Nella programmazione alcune parti di codice possono essere rischiose , possono dar luogo ad eventi

eccezionali che vanno adeguatamente trattati.

Alcuni esempi: Divisione di un intero per zero Accesso ad un elemento di un array con indice fuori dai limiti Accesso ad un riferimento null Aprire un file inesistente Scrivere su un disco pieno Violare un meccanismo di sicurezza si verificano per: Errori software, comportamenti degli utenti non previsti, stato delle risorse, violazione della sicurezza

Luciano Carlotti

Lo stack trace

La cosa pi temuta per un programmatore e vedere il suo programma interrompersi con un messaggio d'errore, pi o meno lungo detto stack trace, come nell'esempio:
/* PROVA DI PROPAGAZIONE DI UNA ECCEZIONE*/ class ProvaCatena { l'output del programma: public static void main(String [] args) { 1 intermedio(new int[] {1,2,3}); 2 System.out.println("FINE"); 3 } Exception in thread "main" static void intermedio(int[] x) { java.lang.ArrayIndexOutOfBoundsException: 3 profondo(x); at ProvaCatena.profondo(ProvaCatena.java:12) } at ProvaCatena.intermedio(ProvaCatena.java:8) static void profondo(int[] y) { at ProvaCatena.main(ProvaCatena.java:4) for(int i=0;i<=y.length; i++) // ERRORE ! System.out.println(y[i]); // provoca l'eccezione Press any key to continue... } }

Luciano Carlotti

prova-cattura

4 Quando si verifica un'eccezione, Java genera un oggetto come istanza di una classe corrispondente l'eccezione
Il blocco try-catch (prova-cattura) serve a catturare tale oggetto.

try bloccoRischioso catch(tipoEccezione nome) bloccoTrattamento

Prova ad eseguire bloccoRischioso, se in esso si verifica un eccezione di tipo tipoEccezione esegui il bloccoTrattamento accedendo ai metodi dell'oggetto generato e passato come riferimento nome

Per ogni metodo il programmatore pu decidere se catturare o gettare le eccezioni, se l'eccez. viene rigettata fino al main si ha lo stack trace. E' utile gestire l'eccezione nel metodo pi vicino alla causa determinante

Luciano Carlotti

Fare programmi Robusti

5 Gestire le eccezioni vuol dire dare robustezza alle applicazioni


evitando situazioni di blocco. In Java il compilatore obbliga il programmatore a gestire le eccezioni controllate (checked)
AssertionError ClassCastException JavaVirtualMachineError

Error
Throwable

IOException RunTimeException

Exception
........

IllegalArgument NullPointer IndexOutOfBounds

Luciano Carlotti

Rifiutare la gestione

Per rifiutare la gestione di un'eccezione controllata ogni metodo deve indicare prima del corpo:
throws tipoecc [, tipoecc,..., tipoecc]
esempi:
public static int parseInt(String s) throws NumberFormatException {
public int read() throws IOException {

Luciano Carlotti

Istruzione try-catch
Try bloccoRischioso catch (tipoEccezione nome1) bloccoTrattamentoTipoEcc1 catch (tipoEccezione nome2) bloccoTrattamentoTipoEcc2 ..... catch (tipoEccezione nomex) bloccoTrattamentoTipoEccx finally bloccoDaEseguireComunque

Luciano Carlotti

Classe Throwable

La classe base per tutte le eccezioni mette a disposizione molti metodi tra cui: toString() restituisce una breve descrizione printStackTrace() stampa lo stack trace getMessage() restituisce la stringa dell'eccez.

Luciano Carlotti

Controllare l'input
Modificare il programma per controllare la correttezza dei dati in input

/* somma.java @author Luciano carlotti */ import java.io.*; public class somma { public static void main(String[] args) { int a,b,som; InputStreamReader input= new InputStreamReader(System.in); BufferedReader tastiera= new BufferedReader(input); try{ System.out.println("\nDammi il primo numero :"); a = Integer.parseInt(tastiera.readLine().trim()); System.out.println("\nDammi il secondo numero :"); b = Integer.parseInt(tastiera.readLine().trim()); som = a + b; System.out.println("la somma e' "+som);

} catch(Exception e){ //cattura ogni tipo di eccezione System.err.println("Errore di IO. Dettagli: "+e.toString()+"<<<<<\n\n"); e.printStackTrace(); } } }

Luciano Carlotti

Istruzione throw

10

le eccezioni possono essere anche definite dal programmatore come classe derivata da Exception e sollevate dall'istruzione throw new tipoEccezione la classe Exception ha due costruttori uno senza parametri uno con una stringa descrittiva il metodo che prevede la possibilit di sollevare un'eccezione per propagarla al chiamante deve avere la clausola throws

Luciano Carlotti

Un esempio
file CounterException.java public class CounterException extends Exception { String message; public CounterException (String msg) { message = msg; } public String getErrorMessage() { return message; } } file MyApplication.java public class MyApplication { public static void main (String args[]) { Counter c1 = new Counter(); System.out.println("Counter 1 has value "+c1.getValue()); try { for (int i=1; i<10; i++) { c1.increment(); System.out.println("Counter 1 is now "+c1.getValue()); } } catch (CounterException e) { System.out.println(e.getErrorMessage()); } } } * Ora acchiappamo una CounterException * Nel trattare l'errore usiamo il metodo getErrorMessage() della stessa per ottenere un messaggio piu' significativo.

11

* Creiamo un nuovo tipo di eccezione CounterException * Gli aggiungiamo un costruttore e un metodo getErrorMessage() in modo da dare un messaggio di errore piu' significativo file Counter.java public class Counter { int value = 0; int topValue = 5; public int increment() throws CounterException { if (value >= topValue) throw (new CounterException("Counter Exceeded")); value ++; return value; } public int getValue() { return value; } } * Ora il contatore lancia l'eccezione CounterException * Quando crea l'oggetto eccezione, nella chiamata al costruttore viene specificato il messaggio di errore.

Luciano Carlotti

Altro esempio
public void addMember(int n) throws DuplicateException { if(isMember(n)) throw new DuplicateException("L'oggetto non puo' essere duplicato"); if(cur_size == numbers.length) return; numbers[cur_size++] = n; } public void showSet() { int i; i=0; System.out.print("{"); while(i < cur_size) { System.out.print(numbers[i] +" "); i++; } System.out.print("}\n\n"); } }

12

La classe Set

class Set { private int numbers[]; private int cur_size; public Set() { cur_size=0; numbers = new int[100]; } public boolean isMember(int n) { int i; i=0; while(i < cur_size) { if(numbers[i]==n) return true; i++; } return false; }

Luciano Carlotti

Altro esempio
import java.lang.Exception; public class DuplicateException extends Exception { String errormessage; public DuplicateException (String s) { super(s); errormessage = s; } public DuplicateException () { super(); errormessage = "DuplicateException"; } public String toString() { return errormessage; } }

13
La classe della nuova eccezione per gestire i duplicati

Luciano Carlotti

Altro esempio

14
La classe di prova della nuova eccezione

class SetTest { public static void main(String args[]) { Set s = new Set(); try { s.addMember(3); s.addMember(8); s.addMember(10); s.showSet(); s.addMember(10);//duplico lelemento, provoco l'eccezione e interrompo il blocco try s.addMember(20); s.showSet(); } catch(DuplicateException _de) { System.err.println(_de.toString());}}}

Luciano Carlotti

Provate....

15 Nella classe DuplicateException cosa succede se:

Nel costruttore con parametro non richiamo super(s)?


Se per non rifefinisco toString() ? E se provo a chiamare _de.getMessage() cosa ho nei due casi? E se nella classe cancello tutto tranne

public DuplicateException (String s) { super(s); }

date una spiegazione ai risultati ottenuti

Luciano Carlotti

esercitazione

16

Provare a far bloccare un programma con alcune eccezioni:


Divisione di un int per 0 indice fuori dal range Formato numerico errato ecc.

Modificare il programma con try-catch per catturare l'eccezione Scrivere una classe con un metodo per leggere un int da tastiera in modo robusto

Luciano Carlotti

I Package

17 Il Package un insieme di classi e di interfacce

collocate su una stessa cartella e con in comune la dichiarazione:

package nom1.nome2. ... .nomeK; questo per:


Raggruppare classi, usando un solo nome Gestire casi di omonimia Dire al compilatore come fare a trovare le classi
java.io.File

Ogni classe ha cos un nome completamente qualificato dato da la seguenza dei nomi delle cartelle nidificate seguita dal nome della classe es: java.lang.round

Luciano Carlotti

I Package

18

La cartella del package se non nserita tra le altre del java deve essere specificata al compilatore e alla JVM nel parametro -classpath

javac -classpath percorsoX ProvaPackage.java java -classpath percorsoX ProvaPackage


I package di piattaforma (API java) son oltre 3000 per la versione 1.4.2 del JDK sono consultabili mediante la guida html creata secondo lo standard javadoc
Documentazione automatica con i TAGLET tra commenti /** commento @author testo @versione testo @param testo @return testo @exception testo @link link */

Luciano Carlotti

I Package

19

La cartella del package se non nserita tra le altre del java deve essere specificata al compilatore e alla JVM nel parametro -classpath

javac -classpath percorsoX ProvaPackage.java java -classpath percorsoX ProvaPackage


I package di piattaforma (API java) son oltre 3000 per la versione 1.4.2 del JDK sono consultabili mediante la guida html creata secondo lo standard javadoc
Documentazione automatica con i TAGLET tra commenti /** commento @author testo @versione testo @param testo @return testo @exception testo @link link */

Luciano Carlotti

Modificatori e visibilita'

20 public, protected e private sono modificatori di accesso rispetto a quella standard detta visibilit di package

un'entit dichiarata nella classe C


Visibilit di un'entit dichiarata in classe C private accessibile 1) solo alla classe C

di package
protected public

2) 1 e nelle classi del package di C


3) 2 e in tutte le sottoclassi di C anche di altri package 4) da qualsiasi classe

Luciano Carlotti

Modificatori e visibilita'

21 Le classi public hanno il vincolo di dover

essere memorizzate in file con lo stesso nome della classe per cui massimo una classe public per file java le altre classi del file saranno visibili solo alle classi del package o se protected alle sottoclassi anche di altri package. Stabilire il livello di visibilit di ogni entit cercando un equilibrio tra sicurezza e complessit.

Luciano Carlotti

Internalizzazione

22 Internationalization --> (i18n) progettare

applicazioni per poter essere adattate a diverse lingue o regioni Localization -->(l10n) processo di adattamento del software ad una specifica regione o linguaggio aggiungendo testi tradotti e altre particolaritDate locali:

Messaggi Suoni Colori Grafica

Valuta Unit misura Indirizzi postali Layouts

Icone

Luciano Carlotti

Package Java.util.

23

Nel package Java.Util troviamo gli strumenti che ci sevono: Locale ResourceBundle PropertyResourceBundle ListResourceBundle GregorianCalendar TimeZone

Luciano Carlotti

Impostare Locale

24 L'oggetto Locale identifica una regione o una lingua. Se una classe varia il suo comportamento sulla base della definizione di Locale di dice local-sensitive.
Creare Locale --> Locale qui = new Locale(cod_ling,cod_reg,opz);

// Inizializzazione del manager di risorse Locale currentLocale; ResourceBundle messages; currentLocale = new Locale(language, country); messages = ResourceBundle.getBundle("MessagesBundle", currentLocale); // Manipolazione delle risorse System.out.println(messages.getString("s1")); System.out.println(messages.getString("s2")); System.out.println(messages.getString("s3"));

Ecco un esempio

Luciano Carlotti

Class ResourceBundle

25 Ogni ResourceBundle un insieme di classi che condividono lo


stesso nome seguito da: _codice-lingua _codice-reg _cod-opz
ButtonLabel //etichetta generica ButtonLabel_de // etichetta in tedesco //etichetta in inglese BG ButtonLabel_en_GB

ButtonLabel_fr_CA_UNIX //etichetta in francese del Canada su Unix

per selezionare la risorsa approriata al locale si usa il metodo .getBundle()


Locale currentLocale = new Locale("fr", "CA", "UNIX"); ResourceBundle msg_benvenuto = ResourceBundle.getBundle("ButtonLabel", currentLocale);

se il metodo non trova la risorsa voluta cercher quelle pi simili o quella di defua altrimenti attiver l'eccezione MissingResourceException

Luciano Carlotti

Sottoclassi PropertyResourceBundle ListResourceBundle

26

Le ResourceBundle possono essere definite tramite un file di testo o un oggetto contenente una matrice dove si associ una chiave ad un valore da usare per la localizzazione della risorsa richiesta. Nel caso di PropertiesResourceBundle si usa un file che deve avere nome uguale al ResourceBundle e suffisso .properties esempio: # commento questo e' il file LabelBundle.properties s1 = computer s2 = disk s3 = monitor s4 = keyboard si possono creare file per tutte le lingue supportate dal programma poi definire la risorsa associata al file di propriet ResourceBundle labels = ResourceBundle.getBundle("LabelsBundle", currentLocale); e prelevare le stringhe associate alla chiave desiderata String value = labels.getString(s1);

Luciano Carlotti

Sottoclassi PropertyResourceBundle ListResourceBundle

27

Nel caso di ListResourceBundle si definiranno tante sottoclassi quanti sono le lingue da gestire con nome uguale e diverso suffisso _lingua_regione dove definire la matrice associativa chiave valore ad esempio: import java.util.*; public class StatsBundle_ja_JP extends ListResourceBundle { public Object[][] getContents() { return contents; } private Object[][] contents = { { "GDP", new Integer(21300) }, //chiave GDP valore 21300 { "Population", new Integer(125449703) }, //chiave Populaiton valore 125449703 { "Literacy", new Double(0.99) }, //chiave Literacy, valore 0.99 }; } si possono creare classi per tutte le lingue supportate dal programma poi definire la risorsa associata al file di propriet ResourceBundle stats =ResourceBundle.getBundle("StatsBundle", currentLocale); e prelevare il dato associato alla chiave desiderata

Un esempio
Luciano Carlotti

28

import java.util.*; import java.text.*; /** * @author Luciano Carlotti */ public class trova { public trova() { } static public void main(String[] args) { //richiamo il metodo per conoscere le definizioni locali disponibili sulla classe DateFormat Locale list[] = DateFormat.getAvailableLocales(); System.out.println(" Elenco definizioni locali disponibili per DateFormat()"); //richiamo i metodi toString() e getDisplayName() della classe Locale for (int i = 0; i < list.length; i++) { System.out.println(list[i].toString() +" nome "+ list[i].getDisplayName()); } //il metodo getDefault() restituisce le impostazioni di default System.out.println("\n\n impostazione Locale di default :"+ list[0].getDefault());

OUTPUT di trova Elenco definizioni locali disponibili per DateFormat() ar nome arabo ar_AE nome arabo (Emirati Arabi Uniti) ar_BH nome arabo (Bahrain) ar_DZ nome arabo (Algeria) ar_EG nome arabo (Egitto) ar_IQ nome arabo (Iraq) ar_JO nome arabo (Giordania) ar_KW nome arabo (Kuwait) .... uk nome ucraino uk_UA nome ucraino (Ucraina) en nome inglese en_US nome inglese (Stati Uniti) .... impostazione Locale di default :it_IT

Un esempio
Luciano Carlotti

29

Provate a internazionalizzare una vostra applicazione java gi funzionante introducendo come parametro dalla riga di comando la lingua scelta tra: en, fr e it in caso di parametro mancante o errato si assumano le impostazioni locali di default, caricare i messaggi del programma in tre file di testo.

Formattare numeri e date


Luciano Carlotti

30

Il package java.text contiene numerose classi che servono a gestire la formattazione come:
NumberFormat DateFormat, MessageFormat, ecc. Ognuna crea un formattatore a cui possibile applicare l'istanza della classe Locale, es:
import java.text.*; DateFormat df = DateFormat.getDateInstance(locale);

df una instanza localizzata del formattatore di date, che ci consente di ottenere informazioni sulla data (df.format, df.getCalendar , df.getTimeZone, eccetera) e di analizzare una stringa che esprime la data nel formato locale (df.parse). Oppure NumberFormat in grado di fornire informazioni sulle consuetudini locali relative ai formati numerici, es.:
NumberFormat nf = NumberFormat.getInstance(locale);

Formattare numeri e date


Luciano Carlotti

Ecco alcuni esempi:

31

FORMATTARE UNA VALUTA CLASSE java.tex.NumberFormat Double importo = new Double(9876543.21); NumberFormat nf; //formattatore String ns; //numero formattato da stapare nf = NumberFormat.getCurrencyInstance(new Locale(en,GB)); ns = nf.format(importo); System.out.println(l'importo in valuta +ns); FORMATTARE UN NUMERO DECIMALE java.text.DecimalFormat String pattern = new String(###,###.##); DecimalFormat decForm = new DecimalFormat(pattern); String output = decForm.format(value); System.out.println(value + " " + pattern + " " + output); FORMATTARE UNA DATA java.text.DataFormat Date oggi; String ds; DateFormat df; //formattatore di date df = DateFormat.getDateInstance(DateFormat.DEFAULT, new Locale(it,IT)); oggi = new Date(); ds = df.format(oggi); System.out.println(oggi il + ds+ in lingua: " + currentLocale.getDisplayName());

Esempi di stili per le date


Luciano Carlotti

32 Quando si istanzia un nuovo formattatore di date si possono


specifcare diversi stili
df = DateFormat.getDateInstance(DateFormat.DEFAULT, currentLocale);

Alcuni esempi di formato data locale Style U.S. Locale French Locale DEFAULT 10-Apr-98 10 avr 98 SHORT 4/10/98 10/04/98 MEDIUM 10-Apr-98 10 avr 98 LONG April 10, 1998 10 avril 1998 FULL Friday, April 10, 1998 vendredi, 10 avril 1998
analogamente pu essere fatto con le ore:
df = DateFormat.getTimeInstance(DateFormat.DEFAULT, currentLocale); df = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, currentLocale);

Una prova
Luciano Carlotti

33

Aggiungete al programma di prova la visualizzazione della data e dell'ora nel formato locale

Formattazione di messaggi
Luciano Carlotti

34

La classe MessageFormat permette di creare messaggi composta da diversi oggetti secondo un pattern da usare tre le resourcebundle, ad esempio per definire un messaggio multilngua per dire: salve Giovanni, sono le 12.24 di marted 14 dicembre 2004, hai 4 messaggi da leggere

1)Trovare le variabili nel messaggio (nome,data e ora, numero messaggi) 2)Creare il pattern del messaggio nei files di propertis

mettendo sulla prima riga la definizione del pattern e dopo le altre chiavi per ogni variabile {indice,tipo,stile} modello = Salve {0}, sone le {1,time,short} di {1,date,full}, hai {2,number,integer} messaggi da leggere

ResourceBundle messaggio = ResourceBundle.getBundle("Messaggio", currentLocale);

3)Creare l'array dei dati mantenendo l'ordine dato nel modello


Object[] mess_args = {new String(Giovanni, new Date(), new Integer(7)};

4)Istanziare il formattatore
MessageFormat mf = new MessageFormat(""); mf.setLocale(currentLocale);

5)Formattare il messaggio
ms.applyPattern(messagggio.getString("template")); String output = mf.format(mes_args);

Ed oltre
Luciano Carlotti

35
La classe Collator fornisce 4 livelli di comparazione: IDENTICAL, PRIMARY, SECONDARY e TERTIARY , il cui significato varia a seconda del locale.

Esistono altre classi appositamente studiate per l'i18n come la jResWrap scaricabile dal sito http://cvs.sourceforge.net/viewcvs.py/jreswrap/
altri siti che trattano l'argomento:

http://www.i18ngurus.com/
http://e-docs.bea.com/wls/docs81/i18n/index.html/ per ogni problema potete consultare il forum specifico http://forum.java.sun.com/forum.jspa?forumID=16/

GESTIONE I/O
Luciano Carlotti

36 Le classi e le interfacce per la gestione dell'I/O


sono contenute nel package java.io Concetto di FLUSSO (stream) oggetto in grado di gesitire una sequenza di dati che corre lungo un canale di comunicazione

0111000101011101001001 0101 01 0110

sorgente

Canale di comunicazione

destinazione

Concatenazione di flussi
Luciano Carlotti

37

Lo stream chaining molto usato in java consiste nel vedere il flusso dati in modi diverso da due punti ad esempio una sequenza di byte di un flusso interno possono essere interpretati come oggetti... come abbiamo gi visto la concatenazione avviene usando un oggetto di flusso interno come parametro di un oggetto di flusso esterno

0111000101011101 0

12/aprile/2004 roma

sorgente

flusso interno

flusso esterno

destinazione

InputStreamReader input = new InputStreamReader(System.in); BufferedReader tastiera = new BufferedReader (input);

Gestire file di testo


Luciano Carlotti

38

Per gestire un file di testo possiamo usare le classi adatte per gestire stringhe: metodi println() e readLine()

Scrivere nel file (OUT) FileWriter --> PrintWriter


leggere dal file (INP) FileReader --> BufferedReader
//scrittura in un file di testo import java.io.*; class ProvaScrittura{ public static void main(String [] args) { PrintWriter testo =null; try { testo= new PrintWriter(new FileWriter(testo.txt));} catch (IOException e) { System.out.println(Errore nella creazione del file:); e.printStackTrace(); System.exit(1);} testo.println(prova di scrittura di un file di testo); for(int i=1;i<11;i++) testo.print( +i); testo.println(\nNumeri da 1 a 10); testo.close(); System.out.println(Scrittura eseguita sul file); }

Luciano Carlotti

Rileggere il file (INPUT) FileReader --> BufferedReader

Gestire file di testo

di un file di testo 39 //lettura import java.io.*; class ProvaLettura{ public static void main(String [] args) { BufferedReader testo =null; try { testo= new BufferedReader(new FileReader(testo.txt)); String s;//LETTURA DEL FILE UNA RIGA ALLA VOLTA s = testo.readLine(); while(s != null) { System.out.println(s); s = testo.readLine(); } testo.close(); //CHIUSURA DEL FILE catch (IOException e) { System.out.println(Errore sul file:); e.printStackTrace(); System.exit(1); } }

PrintWriter
Luciano Carlotti

40

/* * @(#)PrintWriter.java 1.29 03/01/23 * * Copyright 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package java.io; /** * Print formatted representations of objects to a text-output stream. This * class implements all of the print methods found in PrintStream. It does not * contain methods for writing raw bytes, for which a program should use * unencoded byte streams. */

public class PrintWriter extends Writer {

protected Writer out; private boolean autoFlush = false; private boolean trouble = false; /** * Line separator string. This is the value of the line.separator * property at the moment that the stream was created. */ private String lineSeparator;

PrintWriter
Luciano Carlotti

41

/ /** * Create a new PrintWriter, without automatic line flushing. * * @param out A character-output stream */ public PrintWriter (Writer out) { this(out, false); } /** * Create a new PrintWriter. * * @param out A character-output stream * @param autoFlush A boolean; if true, the println() methods will flush * the output buffer */ public PrintWriter(Writer out, boolean autoFlush) { super(out); this.out = out; this.autoFlush = autoFlush; lineSeparator = (String) java.security.AccessController.doPrivileged( new sun.security.action.GetPropertyAction("line.separator")); }

PrintWriter
Luciano Carlotti
/**

42

* Create a new PrintWriter, without automatic line flushing, from an * existing OutputStream. This convenience constructor creates the * necessary intermediate OutputStreamWriter, which will convert characters * into bytes using the default character encoding. * * @param out An output stream * * @see java.io.OutputStreamWriter#OutputStreamWriter(java.io.OutputStream) */ public PrintWriter(OutputStream out) { this(out, false); } /** * Create a new PrintWriter from an existing OutputStream. This * convenience constructor creates the necessary intermediate * OutputStreamWriter, which will convert characters into bytes using the * default character encoding. * * @param out An output stream * @param autoFlush A boolean; if true, the println() methods will flush * the output buffer * * @see java.io.OutputStreamWriter#OutputStreamWriter(java.io.OutputStream) */ public PrintWriter(OutputStream out, boolean autoFlush) { this(new BufferedWriter(new OutputStreamWriter(out)), autoFlush); }

Luciano Carlotti

Esercitazione

43 Scrivere un programma java che legga il nome di un


file di testo da tastiera e visualizzi il contenuto del file a video, se il file non esiste dia il messaggio File inesistente. Leggere un file di testo e crearne una copia con lo stesso nome ed estensione .uc con tutti i caratteri in maiuscolo.

File binari
Luciano Carlotti

44

La possibilit di caricare su file dati di qualsiasi tipo o classe una


caratteristica importante per del Java (salvare oggetti su file da spedire in Internet) Le classi di base sono: per OUTPUT FileOutputStream --> ObjectOutputStream .writeInt(x) scrive un intero nel file .writeDouble(x) scrive un double nel file .writeObject(x) scrive un Object nel file per INPUT FileInputStream --> ObjectInputStream .readInt() legge un intero .readDouble() legge un double .readObject() legge un Object Nel caso di oggetti di classi definite dall'utente, questa dovr implementare l'interfaccia Serializable senza metodi class miaclasse implements Serializable {}

File binari
Luciano Carlotti

45

Esercitazione
1. Con l'aiuto della guida di Eclipse elencare e descrivere i principali metodi delle classi per la gestione dei flussi di oggetti. 2. Realizzare un programma java per l'archiviazione dei dati relativi ai censimenti ornitologici, per ogni censimento si memorizzino le seguenti informazioni: data, luogo, nome e cognome del censitore,numero di uccelli censiti, e per ogni uccello: specie, sottospecie, n.anello, peso, lunghezza remigante, sesso. Scrivere una classe Censimento che implementa Serializable con i metodi per caricare e restituire i dati generali e dei singoli uccelli censiti. Scrivere la classe ArchivioCensimenti per archiviare i dati su file con i metodi per: la crerazione o l'apertura del file, la registrazione di un censiento, la stampa di un censimento, il metodo main per caricare alcuni dati e poi stamparli tutti assieme.

Java collections framework


Luciano Carlotti

46

Il Java Collections Framework `e una libreria formata da un insieme di interfacce e di classi che le implementano per lavorare con gruppi di oggetti (collezioni). Le interfacce e le classi del Collections Framework si trovano nel package java.util Il Collections Framework comprende: Interfacce: rappresentano vari tipi di collezioni di uso comune. Implementazioni: sono classi concrete che implementano le interfacce di cui sopra, utilizzando strutture dati e.cienti (vedi corso di Algoritmi e Strutture Dati). Algoritmi: funzioni che realizzano algoritmi di uso comune, quali algoritmi di ricerca e di ordinamento su oggetti che implementano le interfacce del Collections Framework.

Java collections framework


Luciano Carlotti

47

Framework 1.4

Il Framework 1.5 ha reso parametriche tutte le classi Sono state aggiunte altre collezioni come le code Queue

Java.util.Collections
Luciano Carlotti

48

Java.util.Set
Luciano Carlotti

49

Esempio di lista
Luciano Carlotti

50

import java.util.*; public class ListExample { public static void main(String args[]) { List list = new ArrayList(); list.add("Bernadine"); list.add("Elizabeth"); list.add("Gene"); list.add("Elizabeth"); list.add("Clara"); System.out.println(list); System.out.println("2: " + list.get(2)); System.out.println("0: " + list.get(0)); LinkedList queue = new LinkedList(); queue.addFirst("Bernadine"); queue.addFirst("Elizabeth"); queue.addFirst("Gene"); queue.addFirst("Elizabeth"); queue.addFirst("Clara"); System.out.println(queue); queue.removeLast(); queue.removeLast(); System.out.println(queue); }