Gestione delle Eccezioni Gestione delle Eccezioni
C. Horstmann
C. Horstmann
Fondamenti di programmazione e Java 2
Fondamenti di programmazione e Java 2
3^ edizione Apogeo
3^ edizione Apogeo
trad. Nicola Fanizzi
trad. Nicola Fanizzi
2 2
Obiettivi Obiettivi
Imparare a lanciare eccezioni Imparare a lanciare eccezioni
Essere capaci di progettare le proprie classi di Essere capaci di progettare le proprie classi di eccezioni
eccezioni
Capire la differenza tra eccezioni controllate e Capire la differenza tra eccezioni controllate e incontrollate
incontrollate
Imparare a catturare le eccezioni Imparare a catturare le eccezioni
Sapere quando e dove catturare un'eccezione Sapere quando e dove catturare un'eccezione
3 3
Gestione Errori Gestione Errori
Approccio tradizionale: il metodo restituisce un Approccio tradizionale: il metodo restituisce un codice d'errore
codice d'errore
Problema: dimenticare di controllare il codice-errore Problema: dimenticare di controllare il codice-errore
La notifica di errore potrebbe passare inosservata La notifica di errore potrebbe passare inosservata
Problema: il metodo chiamante potrebbe non essere Problema: il metodo chiamante potrebbe non essere in grado di far niente in caso di errore
in grado di far niente in caso di errore
Anche il programma deve riportare un errore e delegare il Anche il programma deve riportare un errore e delegare il
proprio chiamante ad occuparsene
4 4
Gestione Errori Gestione Errori
Invece di programmare pensando ai casi di Invece di programmare pensando ai casi di successo:
successo:
si dovrebbe sempre programmare stando attenti ai si dovrebbe sempre programmare stando attenti ai
possibili errori:
possibili errori:
x.doSomething() x.doSomething()
if (!x.doSomething()) return false;
if (!x.doSomething()) return false;
5 5
Lanciare Eccezioni Lanciare Eccezioni
Eccezioni: Eccezioni:
Non si possono ignorare Non si possono ignorare
Inviate direttamente ad un gestore ( Inviate direttamente ad un gestore ( exception handler exception handler )–e )–e non semplicemente al chiamante del metodo che ha
non semplicemente al chiamante del metodo che ha causato il problema
causato il problema
Lancia un'eccezione (è un oggetto) per segnalare Lancia un'eccezione (è un oggetto) per segnalare una condizione eccezionale
una condizione eccezionale
Esempio: Esempio: IllegalArgumentException IllegalArgumentException : :
6 6
Lanciare Eccezioni Lanciare Eccezioni
Non occorre immagazzinare l'oggetto eccezione in Non occorre immagazzinare l'oggetto eccezione in una variabile:
una variabile:
Quando si lancia un'eccezione, il metodo termina Quando si lancia un'eccezione, il metodo termina immediatamente
immediatamente
L'esecuzione continua con un L'esecuzione continua con un gestore delle eccezioni gestore delle eccezioni
throw new IllegalArgumentException("Amount exceeds balance");
throw new IllegalArgumentException("Amount exceeds balance");
7 7
Esempio Esempio
public class BankAccount public class BankAccount { {
public void withdraw(double amount) public void withdraw(double amount) {
{
if (amount > balance) if (amount > balance) {
{
IllegalArgumentException exception IllegalArgumentException exception
= new IllegalArgumentException("Amount = new IllegalArgumentException("Amount exceeds balance");
exceeds balance");
throw exception;
throw exception;
} }
balance = balance - amount;
balance = balance - amount;
} }
. . . . . .
8 8
Gerarchia delle
Gerarchia delle
Classi di Eccezioni
Classi di Eccezioni
9 9
Sintassi 15.1:
Sintassi 15.1:
Lanciare un'Eccezione Lanciare un'Eccezione
throw throw exceptionObject exceptionObject ; ;
Esempio Esempio : :
throw new IllegalArgumentException(); throw new IllegalArgumentException();
Scopo Scopo : lanciare un'eccezione e trasferire il controllo : lanciare un'eccezione e trasferire il controllo al gestore per questo tipo di eccezione
al gestore per questo tipo di eccezione
10 10
Eccezioni Eccezioni Controllate e Non Controllate Controllate e Non Controllate
Due tipi di eccezioni: Due tipi di eccezioni:
Controllate (checked) Controllate (checked)
Il compilatore controlla che non vengano ignorate Il compilatore controlla che non vengano ignorate
Dovute a cause esterne che il programmatore non saprebbe Dovute a cause esterne che il programmatore non saprebbe prevenire
prevenire
La maggioranza di essere accade quando si tratta l'I/O La maggioranza di essere accade quando si tratta l'I/O
Ad esempio: Ad esempio: IOException IOException
11 11
Eccezioni Eccezioni Controllate e Non Controllate Controllate e Non Controllate
Due tipi di eccezioni: Due tipi di eccezioni:
Non controllate: Non controllate:
Estendono le classi RuntimeException Estendono le classi RuntimeException o Error o Error
Sono da Sono da imputare imputare al programmatore al programmatore
Esempi di eccezioni di runtime: Esempi di eccezioni di runtime:
Esempio di errore: OutOfMemoryError Esempio di errore: OutOfMemoryError
NumberFormatException NumberFormatException IllegalArgumentException IllegalArgumentException NullPointerException
NullPointerException
12 12
Eccezioni Eccezioni Controllate e Non Controllate Controllate e Non Controllate
Le categorie non sono precise: Le categorie non sono precise:
Scanner.nextInt Scanner.nextInt lancia l'eccezione non lancia l'eccezione non controllata
controllata InputMismatchException InputMismatchException
Il programmatore non può prevenire l'immissione di input Il programmatore non può prevenire l'immissione di input non corretto da parte degli utenti
non corretto da parte degli utenti
Questa scelta rende la classe facile da usare per Questa scelta rende la classe facile da usare per programmatori principianti
programmatori principianti
Si ha a che fare con eccezioni controllate quando si Si ha a che fare con eccezioni controllate quando si programma con file e stream
programma con file e stream
13 13
Eccezioni Eccezioni Controllate e Non Controllate Controllate e Non Controllate
Ad esempio, Ad esempio, si usi uno
si usi uno Scanner Scanner per leggere un file per leggere un file
Ma il costruttore di
Ma il costruttore di FileReader FileReader può lanciare una può lanciare una FileNotFoundException
FileNotFoundException
String filename = . . .;
String filename = . . .;
FileReader reader = new FileReader(filename);
FileReader reader = new FileReader(filename);
Scanner in = new Scanner(reader);
Scanner in = new Scanner(reader);
14 14
Eccezioni Eccezioni Controllate e Non Controllate Controllate e Non Controllate
Due scelte: Due scelte:
Gestire l'eccezione Gestire l'eccezione
Dire al compilatore che si vuole che il metodo termini Dire al compilatore che si vuole che il metodo termini quando si abbia l'eccezione
quando si abbia l'eccezione
Si usa lo specificatore throws Si usa lo specificatore throws affinché il metodo possa affinché il metodo possa lanciare un'eccezione controllata
lanciare un'eccezione controllata
public void read(String filename) throws FileNotFoundException public void read(String filename) throws FileNotFoundException { {
FileReader reader = new FileReader(filename);
FileReader reader = new FileReader(filename);
Scanner in = new Scanner(reader);
Scanner in = new Scanner(reader);
. . . . . . } }
15 15
Eccezioni Eccezioni Controllate e Non Controllate Controllate e Non Controllate
Per eccezioni multiple: Per eccezioni multiple:
Tenere presente la gerarchia di ereditarietà: Tenere presente la gerarchia di ereditarietà:
Meglio dichiarare l'eccezione piuttosto che gestirla in Meglio dichiarare l'eccezione piuttosto che gestirla in maniera sprovveduta
maniera sprovveduta
public void read(String filename) public void read(String filename)
throws IOException, ClassNotFoundException throws IOException, ClassNotFoundException
16 16
Sintassi 15.2:
Sintassi 15.2:
Specifica delle Eccezioni Specifica delle Eccezioni
accessSpecifier returnType accessSpecifier returnType methodName
methodName((parameterType parameterNameparameterType parameterName, . . ., . . .))
throwsthrows ExceptionClass, ExceptionClass, ExceptionClass, . . .ExceptionClass, . . .
Esempio: Esempio:
public void read(BufferedReader in) throws IOExceptionpublic void read(BufferedReader in) throws IOException
Scopo Scopo : indicare le eccezioni controllate che questo : indicare le eccezioni controllate che questo metodo possa lanciare
metodo possa lanciare
17 17
Catturare Eccezioni Catturare Eccezioni
Installare un gestore di eccezioni con l'istruzione Installare un gestore di eccezioni con l'istruzione try try / / catch catch : :
Il blocco try Il blocco try contiene istruzioni che possono causare contiene istruzioni che possono causare un'eccezione
un'eccezione
La clausola La clausola catch catch introduce il gestore per un tipo di introduce il gestore per un tipo di eccezione
eccezione
18 18
Catturare Eccezioni Catturare Eccezioni
Esempio: Esempio:
try try { {
String filename = . . .;
String filename = . . .;
FileReader reader = new FileReader(filename);
FileReader reader = new FileReader(filename);
Scanner in = new Scanner(reader);
Scanner in = new Scanner(reader);
String input = in.next();
String input = in.next();
int value = Integer.parseInt(input);
int value = Integer.parseInt(input);
. . . . . . } }
catch (IOException exception) catch (IOException exception) { {
exception.printStackTrace();
exception.printStackTrace();
} }
catch (NumberFormatException exception) catch (NumberFormatException exception) { {
System.out.println("Input was not a number");
System.out.println("Input was not a number");
19 19
Catturare Eccezioni Catturare Eccezioni
Le istruzioni in un blocco Le istruzioni in un blocco try try vengono eseguite vengono eseguite
Se non si ha nessuna eccezione, Se non si ha nessuna eccezione, le clausole
le clausole catch catch sono saltate sono saltate
Se si ha un'eccezione di uno dei tipi gestiti, Se si ha un'eccezione di uno dei tipi gestiti, l'esecuzione salta al corrispondente blocco
l'esecuzione salta al corrispondente blocco catch catch
Se si ha un'eccezione di altro tipo, Se si ha un'eccezione di altro tipo,
essa viene rilanciata fino a quando non venga
essa viene rilanciata fino a quando non venga
20 20
Catturare Eccezioni Catturare Eccezioni
catch (IOException exception) catch (IOException exception) block
block
exception exception contiene il riferimento all'oggetto contiene il riferimento all'oggetto eccezione che era stato lanciato
eccezione che era stato lanciato
La clausola La clausola catch catch può analizzare l'oggetto per scoprire può analizzare l'oggetto per scoprire altri
altri dettagli dettagli
exception.printStackTrace() exception.printStackTrace() : stampa : stampa della catena di chiamate di metodi che hanno portato ad della catena di chiamate di metodi che hanno portato ad exception
exception
21 21
Sintassi 15.3:
Sintassi 15.3:
Blocco
Blocco try try Generico Generico
trytry {{
statementstatement statementstatement . . . . . . } }
catch (
catch (ExceptionClass exceptionObject)ExceptionClass exceptionObject) {{
statementstatement statementstatement . . . . . .
} }
catch (
catch (ExceptionClass exceptionObject)ExceptionClass exceptionObject) {{
statement statement statementstatement
22 22
Sintassi 15.3:
Sintassi 15.3:
Blocco
Blocco try try Generico Generico
Example: Example:
trytry {{
System.out.println("How old are you?"); System.out.println("How old are you?");
int age = in.nextInt(); int age = in.nextInt();
System.out.println("Next year, you'll be " + (age + 1)); System.out.println("Next year, you'll be " + (age + 1));
}}
catch (InputMismatchException exception) catch (InputMismatchException exception) {{
exception.printStackTrace(); exception.printStackTrace();
}}
Scopo Scopo : eseguire una o più istruzioni che possono generare : eseguire una o più istruzioni che possono generare eccezioni. Se si ha un'eccezione tra quelle delle clausole eccezioni. Se si ha un'eccezione tra quelle delle clausole
catch si esegue la prima di esse. Se non si hanno eccezioni,
catch si esegue la prima di esse. Se non si hanno eccezioni,
23 23
La clausola
La clausola finally finally
Un'eccezione causa la terminazione del metodo Un'eccezione causa la terminazione del metodo corrente
corrente
Pericolo Pericolo : può far saltare del codice che è essenziale : può far saltare del codice che è essenziale Esempio:
Esempio:
reader = new FileReader(filename);
reader = new FileReader(filename);
Scanner in = new Scanner(reader);
Scanner in = new Scanner(reader);
readData(in);
readData(in);
reader.close();
reader.close();
// si potrebbe non arrivare mai qui // si potrebbe non arrivare mai qui
24 24
La clausola
La clausola finally finally
Occorre eseguire Occorre eseguire reader.close() reader.close() anche se si ha l'eccezione
anche se si ha l'eccezione
Si usa la clausola Si usa la clausola finally finally per il codice che deve per il codice che deve essere eseguito "a prescindere"
essere eseguito "a prescindere"
FileReader reader = new FileReader(filename);
FileReader reader = new FileReader(filename);
try try { {
Scanner in = new Scanner(reader);
Scanner in = new Scanner(reader);
readData(in);
readData(in);
} }
finally finally { {
reader.close();
reader.close(); // se si ha un'eccezione, la clausola // se si ha un'eccezione, la clausola
// finally viene sempre eseguita // finally viene sempre eseguita
25 25
La clausola
La clausola finally finally
Eseguita quando si esce dal blocco Eseguita quando si esce dal blocco try try in uno dei in uno dei tre modi:
tre modi:
Dopo l'ultima istruzione del blocco try Dopo l'ultima istruzione del blocco try
Dopo l'ultima istruzione della clausola catch Dopo l'ultima istruzione della clausola catch se il blocco se il blocco try try ha catturato un'eccezione ha catturato un'eccezione
Quando un'eccezione è stata lanciata dal blocco try Quando un'eccezione è stata lanciata dal blocco try e e non è stata catturata
non è stata catturata
Raccomandazione: tenere distinte le clausole Raccomandazione: tenere distinte le clausole
26 26
Sintassi 15.4:
Sintassi 15.4:
La clausola
La clausola finally finally
try try { {
statement statement statement statement . . . . . .
} }
finally finally { {
statement statement statement statement . . . . . .
} }
27 27
Sintassi 15.4:
Sintassi 15.4:
La clausola
La clausola finally finally
Esempio Esempio : :
FileReader reader = new FileReader(filename);
FileReader reader = new FileReader(filename);
trytry {{
readData(reader); readData(reader);
}}
finally finally {{
reader.close(); reader.close();
}}
Scopo Scopo : assicurare che le istruzioni nella clausola : assicurare che le istruzioni nella clausola finally
finally siano eseguite a prescindere dal fatto siano eseguite a prescindere dal fatto
28 28
Si possono progettare propri tipi di eccezioni– Si possono progettare propri tipi di eccezioni–
sottoclassi di
sottoclassi di Exception Exception o o RuntimeException
RuntimeException
La si può rendere eccezione non controllata – La si può rendere eccezione non controllata –
il programmatore avrebbe potuto evitarla chiamando il programmatore avrebbe potuto evitarla chiamando
Progettare i Propri Progettare i Propri
Tipi d'Eccezione Tipi d'Eccezione
if (amount > balance) if (amount > balance) { {
throw new InsufficientFundsException(
throw new InsufficientFundsException(
"withdrawal of " + amount + " exceeds balance of "withdrawal of " + amount + " exceeds balance of
“ + balance);
“ + balance);
} }
29 29
Si può estende Si può estende RuntimeException RuntimeException o una o una delle sue sottoclassi
delle sue sottoclassi
Fornire due costruttori Fornire due costruttori
Costruttore di default Costruttore di default
Costruttore che accetta una stringa di messaggio Costruttore che accetta una stringa di messaggio che descriva la ragione dell'eccezione
che descriva la ragione dell'eccezione
Progettare i Propri Progettare i Propri
Tipi d'Eccezione
Tipi d'Eccezione
30 30
Progettare i Propri Progettare i Propri
Tipi d'Eccezione Tipi d'Eccezione
public class InsufficientFundsException public class InsufficientFundsException extends RuntimeException
extends RuntimeException { {
public InsufficientFundsException() {}
public InsufficientFundsException() {}
public InsufficientFundsException(String message) public InsufficientFundsException(String message) {
{
super(message);
super(message);
} } }}
31 31
Programma Completo Programma Completo
Programma Programma
Chiedere all'utente un nome di file Chiedere all'utente un nome di file
Ci si aspetta che il file contenga dei valori Ci si aspetta che il file contenga dei valori
La prima riga del file contiene il numero totale di valori La prima riga del file contiene il numero totale di valori
Le rimanenti contengono i dati Le rimanenti contengono i dati
Tipico file di input: Tipico file di input:
3 3
1.45 1.45
32 32
Programma Completo Programma Completo
Cosa può andar male ? Cosa può andar male ?
Il file potrebbe non esistere Il file potrebbe non esistere
Il file potrebbe contenere dati in formato sbagliato Il file potrebbe contenere dati in formato sbagliato
Chi può accorgersi degli errori ? Chi può accorgersi degli errori ?
Il costruttore FileReader Il costruttore FileReader lancerà una eccezione lancerà una eccezione quando il file non esiste
quando il file non esiste
I metodi che elaborano l'input hanno bisogno di lanciare I metodi che elaborano l'input hanno bisogno di lanciare
una eccezione se trovano un errore nel formato dei dati
una eccezione se trovano un errore nel formato dei dati
33 33
Programma Completo Programma Completo
Quali eccezioni si possono lanciare? Quali eccezioni si possono lanciare?
FileNotFoundException FileNotFoundException può essere lanciata può essere lanciata dal costruttore di
dal costruttore di FileReader FileReader
IOException IOException può essere lanciata dal metodo close di può essere lanciata dal metodo close di FileReader
FileReader
BadDataException BadDataException , ,
una classe ad hoc d'eccezione controllata
una classe ad hoc d'eccezione controllata
34 34
Programma Completo Programma Completo
Chi può rimediare agli errori riportati dalle eccezioni? Chi può rimediare agli errori riportati dalle eccezioni?
Solo il metodo Solo il metodo main main del programma del programma DataSetTester
DataSetTester interagisce con l'utente interagisce con l'utente
Cattura eccezioni Cattura eccezioni
Stampa messaggi d'errore appropriati Stampa messaggi d'errore appropriati
Dà all'utente un'altra possibilità di inserimento di un nome di file Dà all'utente un'altra possibilità di inserimento di un nome di file corretto
corretto
35 35
DataSetTester.java DataSetTester.java
01: import java.io.FileNotFoundException;
01: import java.io.FileNotFoundException;
02: import java.io.IOException;
02: import java.io.IOException;
03: import java.util.Scanner;
03: import java.util.Scanner;
04: 04:
05: public class DataSetTester 05: public class DataSetTester 06: {
06: {
07: public static void main(String[] args) 07: public static void main(String[] args) 08: {
08: {
09: Scanner in = new Scanner(System.in);
09: Scanner in = new Scanner(System.in);
10: DataSetReader reader = new DataSetReader();
10: DataSetReader reader = new DataSetReader();
11:
11:
12: boolean done = false;
12: boolean done = false;
13: while (!done) 13: while (!done) 14: {
14: {
15: try 15: try
36 36
DataSetTester.java DataSetTester.java
17: System.out.println("Please enter the file name:
17: System.out.println("Please enter the file name:
");
");
18: String filename = in.next();
18: String filename = in.next();
19:
19:
20: double[] data = reader.readFile(filename);
20: double[] data = reader.readFile(filename);
21: double sum = 0;
21: double sum = 0;
22: for (double d : data) sum = sum + d;
22: for (double d : data) sum = sum + d;
23: System.out.println("The sum is " + sum);
23: System.out.println("The sum is " + sum);
24: done = true;
24: done = true;
25: }
25: } // blocco try// blocco try
37 37
DataSetTester.java DataSetTester.java
26: catch (FileNotFoundException exception) 26: catch (FileNotFoundException exception) 27: {
27: {
28: System.out.println("File not found.");
28: System.out.println("File not found.");
29: } 29: }
30: catch (BadDataException exception) 30: catch (BadDataException exception) 31: {
31: {
32: System.out.println 32: System.out.println
("Bad data: " + exception.getMessage()); ("Bad data: " + exception.getMessage());
33: } 33: }
34: catch (IOException exception) 34: catch (IOException exception) 35: {
35: {
36: exception.printStackTrace();
36: exception.printStackTrace();
37: } 37: } 38: }
38: } // while// while 39: }
39: } // main// main 40: }
40: } // classe// classe
38 38
Il metodo
Il metodo readFile readFile della della classe
classe DataSetTester DataSetTester
Costruisce l'oggetto Costruisce l'oggetto Scanner Scanner
Chiama il metodo Chiama il metodo readData readData
Si disinteressa completamente di qualunque Si disinteressa completamente di qualunque eccezione
eccezione
39 39
Il metodo
Il metodo readFile readFile della della classe
classe DataSetTester DataSetTester
Se c'è un problema con il file di input, passa Se c'è un problema con il file di input, passa semplicemente
semplicemente l'eccezione al chiamante l'eccezione al chiamante
public double[] readFile(String filename) public double[] readFile(String filename) throws IOException, BadDataException throws IOException, BadDataException
// FileNotFoundException è una IOException // FileNotFoundException è una IOException { {
FileReader reader = new FileReader(filename);
FileReader reader = new FileReader(filename);
try try { {
Scanner in = new Scanner(reader);
Scanner in = new Scanner(reader);
readData(in);
readData(in);
} }
40 40
Il metodo
Il metodo readFile readFile della della classe
classe DataSetTester DataSetTester
finally finally {
{
reader.close();
reader.close();
} }
return data;
return data;
}}
41 41
Il metodo
Il metodo readData readData della della classe
classe DataSetTester DataSetTester
Legge il numero di valori Legge il numero di valori
Costruisce un array Costruisce un array
Chiama Chiama readValue readValue per ogni valore per ogni valore
Controlla due potenziali errori: Controlla due potenziali errori:
Il file potrebbe non cominciare con un intero Il file potrebbe non cominciare con un intero
Il file potrebbe avere ancora dati dopo la lettura di quelli Il file potrebbe avere ancora dati dopo la lettura di quelli indicati nella prima riga
indicati nella prima riga
42 42
Il metodo
Il metodo readData readData della della classe
classe DataSetTester DataSetTester
private void readData(Scanner in) throws BadDataException private void readData(Scanner in) throws BadDataException { {
if (!in.hasNextInt()) if (!in.hasNextInt())
throw new BadDataException("Length expected"); throw new BadDataException("Length expected");
int numberOfValues = in.nextInt(); int numberOfValues = in.nextInt();
data = new double[numberOfValues]; data = new double[numberOfValues];
for (int i = 0; i < numberOfValues; i++) for (int i = 0; i < numberOfValues; i++)
readValue(in, i); readValue(in, i);
if (in.hasNext()) if (in.hasNext())
throw new BadDataException("End of file expected"); throw new BadDataException("End of file expected");
}}
43 43
Il metodo
Il metodo readValue readValue della della classe
classe DataSetTester DataSetTester
private void readValue(Scanner in, int i) private void readValue(Scanner in, int i) throws BadDataException
throws BadDataException { {
if (!in.hasNextDouble()) if (!in.hasNextDouble())
throw new BadDataException("Data value expected");
throw new BadDataException("Data value expected");
data[i] = in.nextDouble();
data[i] = in.nextDouble();
} }
44 44
Scenario Scenario
1. 1. DataSetTester.main DataSetTester.main chiama chiama DataSetReader.readFile DataSetReader.readFile 2. 2. readValue readValue chiama chiama readData readData 3. 3. readData readData chiama chiama readValue readValue
4. 4. readValue readValue non trova il valore che si attendeva non trova il valore che si attendeva e lancia
e lancia BadDataException BadDataException
5. 5. readValue readValue non ha un gestore per l'eccezione e non ha un gestore per l'eccezione e termina
termina
45 45
Scenario Scenario
6. 6. readData readData non ha un gestore per le eccezioni e non ha un gestore per le eccezioni e termina
termina
7. 7. readFile readFile non ha un gestore per le eccezioni e non ha un gestore per le eccezioni e termina dopo aver eseguito la clausola
termina dopo aver eseguito la clausola finally finally 8. 8. DataSetTester.main DataSetTester.main ha un gestore per ha un gestore per
BadDataException
BadDataException ; il gestore stampa un ; il gestore stampa un messaggio e si dà all'utente un'altra possibilità di messaggio e si dà all'utente un'altra possibilità di
immissione del nome del file
immissione del nome del file
46 46
DataSetReader.java DataSetReader.java
01: import java.io.FileReader;
01: import java.io.FileReader;
02: import java.io.IOException;
02: import java.io.IOException;
03: import java.util.Scanner;
03: import java.util.Scanner;
04: 04:
05: /**
05: /**
06: legge un insieme di dati da file.
06: legge un insieme di dati da file.
// il file ha il formato // il file ha il formato 07: numberOfValues
07: numberOfValues 08: valore1
08: valore1 09: valore2 09: valore2 10: . . . 10: . . . 11: */
11: */
12: public class DataSetReader 12: public class DataSetReader 13: {
13: {
47 47
DataSetReader.java DataSetReader.java
14: /**
14: /**
15: legge un insieme di dati.
15: legge un insieme di dati.
16: @param filename il nome del file contenente i dati 16: @param filename il nome del file contenente i dati 17: @return i dati del file
17: @return i dati del file 18: */
18: */
19: public double[] readFile(String filename) 19: public double[] readFile(String filename) 20: throws IOException, BadDataException 20: throws IOException, BadDataException 21: {
21: {
22: FileReader reader = new FileReader(filename);
22: FileReader reader = new FileReader(filename);
23: try 23: try 24: { 24: {
25: Scanner in = new Scanner(reader);
25: Scanner in = new Scanner(reader);
26: readData(in);
26: readData(in);
27: } 27: }
28: finally 28: finally
48 48
DataSetReader.java DataSetReader.java
35: /**
35: /**
36: legge tutti i dati.
36: legge tutti i dati.
37: @param in lo scanner che scandisce i dati 37: @param in lo scanner che scandisce i dati 38: */
38: */
39: private void readData(Scanner in) throws BadDataException 39: private void readData(Scanner in) throws BadDataException 40: {
40: {
41: if (!in.hasNextInt()) 41: if (!in.hasNextInt())
42: throw new BadDataException("Length expected");
42: throw new BadDataException("Length expected");
43: int numberOfValues = in.nextInt();
43: int numberOfValues = in.nextInt();
44: data = new double[numberOfValues];
44: data = new double[numberOfValues];
45: 45:
46: for (int i = 0; i < numberOfValues; i++) 46: for (int i = 0; i < numberOfValues; i++) 47: readValue(in, i);
47: readValue(in, i);
48: 48:
49: if (in.hasNext()) 49: if (in.hasNext())
50: throw new BadDataException("End of file expected");
50: throw new BadDataException("End of file expected");
51: } 51: } 52: 52:
49 49
DataSetReader.java DataSetReader.java
53: /**
53: /**
54: legge il valore di un dato . 54: legge il valore di un dato .
55: @param in lo scanner che scandisce i dati 55: @param in lo scanner che scandisce i dati 56: @param i la posizione del valore da leggere 56: @param i la posizione del valore da leggere 57: */
57: */
58: private void readValue(Scanner in, int i) 58: private void readValue(Scanner in, int i)
throws BadDataExceptionthrows BadDataException 59: {
59: {
60: if (!in.hasNextDouble()) 60: if (!in.hasNextDouble())
61: throw new BadDataException("Data value expected");
61: throw new BadDataException("Data value expected");
62: data[i] = in.nextDouble();
62: data[i] = in.nextDouble();
63: } 63: } 64: 64: