• Non ci sono risultati.

Gestione delle Eccezioni Gestione delle Eccezioni

N/A
N/A
Protected

Academic year: 2021

Condividi "Gestione delle Eccezioni Gestione delle Eccezioni"

Copied!
49
0
0

Testo completo

(1)

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 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 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 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 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 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 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 8

Gerarchia delle

Gerarchia delle

Classi di Eccezioni

Classi di Eccezioni

(9)

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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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:

Riferimenti

Documenti correlati

 classi che permettono di scrivere o leggere flussi di dati di tipo base espressi in maniera binaria.

 classi che permettono di scrivere o leggere flussi di dati di tipo base espressi in maniera binaria.

 Se un programma non gestisce le sue eccezioni di Se un programma non gestisce le sue eccezioni di run-time, termina quando se ne verifica una. run-time, termina quando se

 All’atto pratico, se stiamo scrivendo un metodo in cui vogliamo invocarne un altro, ma questo metodo annuncia una throws di un’eccezione controllata che non sappiamo gestire:.

Attraverso esse sarà possibile creare eccezioni personalizzate e decidere non solo come, ma anche in quale parte del codice gestirle, e questo è implementato nella

917 (TUIR), le persone fisiche fiscalmente non residenti nel territorio dello Stato sono soggetti passivi IRPEF e il relativo reddito complessivo è formato soltanto dai redditi

Modifica della CPU multi-ciclo per la gestione delle eccezioni Esempio di SW di risposta ad un’eccezione /

destinazione del salto Salto non eseguito (not taken): al salto seguono le istruzioni successive del programma (fall-through).. 40 beq, $1,