Capitolo 10
Eccezioni
Lucidi relativi al volume:
Java – Guida alla programmazione
James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Eccezione
Evento anormale
programma
che
avviene
durante
l'esecuzione
del
Esempi
Manipolare file non esistenti
FileReader in = new FileReader("mumbers.txt“);
Indice dell'array non corretto
int[] a = new int[3];
a[4] = 1000;
Operazioni aritmetiche improprie
a[2] = 1000 / 0;
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Trattamento di un'eccezione in Java
Se avviene l'eccezione ed è attivo un gestore
Il flusso di controllo viene trasferito al gestore
Dopo che il gestore ha completato il flusso del controllo
continua con l'istruzione che segue il gestore
Se avviene un'eccezione e non esiste un gestore per essa
Il programma termina
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Attività
Richiedere ed estrarre il nome di un file
Da quel file, devono essere estratti due valori interi
Calcolare e visualizzare il quoziente dei valori
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Implementazione
Necessario perché main() non
gestisce le sue possibili
IOExceptions
public static void main(String[] args) throws IOException {
BufferedReader stdin = new BufferedReader(
new InputStreamReader(System.in));
System.out.print("Filename: ");
String s = stdin.readLine();
BufferedReader filein = new BufferedReader(
new FileReader(s));
int a = Integer.parseInt(filein.readLine());
int b = Integer.parseInt(filein.readLine());
System.out.println( a / b );
}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Che cosa non va?
public static void main(String[] args) throws IOException {
BufferedReader stdin = new BufferedReader(
new InputStreamReader(System.in));
System.out.print("Filename: ");
String s = stdin.readLine();
BufferedReader filein = new BufferedReader(
new FileReader(s));
int a = Integer.parseInt(filein.readLine());
int b = Integer.parseInt(filein.readLine());
System.out.println( a / b );
}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Come si possono gestire i problemi?
public static void main(String[] args) throws IOException {
BufferedReader stdin = new BufferedReader(
new InputStreamReader(System.in));
System.out.print("Filename: ");
String s = stdin.readLine();
BufferedReader filein = new BufferedReader(
new FileReader(s));
int a = Integer.parseInt(filein.readLine());
int b = Integer.parseInt(filein.readLine());
System.out.println( a / b );
}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Gestori delle eccezioni
Il codice che potrebbe generare un'eccezione è inserito in un
blocco try
Se non vi sono eccezioni, i gestori vengono ignorati
Per ogni tipo di eccezione potenziale esiste un gestore catch
Al termine del gestore il programma continua con
l'istruzione dopo i gestori
try {
Codice che potrebbe generare eccezioni di tipo E o F
}
catch (E e) {
Gestisce l'eccezione e
}
catch (F f) {
Gestisce l'eccezione f
}
Altro codice
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Introduzione ai blocchi try-catch
public static void main(String[] args) throws IOException {
BufferedReader stdin = new BufferedReader(
new InputStreamReader(System.in));
System.out.print("Filename: ");
String s = stdin.readLine();
BufferedReader filein = new BufferedReader(
new FileReader(s));
int a = Integer.parseInt(filein.readLine());
int b = Integer.parseInt(filein.readLine());
System.out.println( a / b );
}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Acquisizione del nome file
BufferedReader stdin = new BufferedReader(
new InputStreamReader(System.in));
System.out.print("Filename: ");
String s = null;
try
s = stdin.readLine();
}
catch (IOException e)
System.err.println("Cannot read input");
System.exit(0);
}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Impostazione dell'elaborazione del flusso
dei file
Copyright © 2004 - The McGraw-Hill Companies srl
BufferedReader filein = null;
try
filein = new BufferedReader(new FileReader(s));
}
catch (FileNotFoundException e)
System.err.println(s + ": cannot be opened");
System.exit(0);
}
Come potrebbe main() generare un'espressione che non
indica che potrebbe lanciare una FileNotFoundException?
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Acquisizione dell'input
try
int a = Integer.parseInt(filein.readLine());
int b = Integer.parseInt(filein.readLine());
System.out.println( a / b );
}
catch (IOException e)
System.err.println(s + ": unable to read values");
}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Conversione dell'input
try
int a = Integer.parseInt(filein.readLine());
int b = Integer.parseInt(filein.readLine());
System.out.println( a / b );
}
catch (IOException e)
System.err.println(s + ": unable to read values");
}
catch (NumberFormatException e)
if (e.getMessage().equals("null"))
System.err.println(s + ": need two inputs");
}
else
System.err.println(s + ": invalid inputs");
}
}
Come potrebbe main() generare un'espressione che non
indica che potrebbe lanciare una NumberFormatException?
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Eccezioni di run-time
Realizzate dai designer Java
Le eccezioni di run-time avvengono in un programma
Il costo di implementazione dei gestori per le eccezioni di
run-time di solito supera il vantaggio previsto
In Java un metodo può intercettarle facoltativamente o
specificare che vengono lanciate
Ad ogni modo, se un programma non gestisce le sue
eccezioni di run-time, viene terminato quando se ne verifica
una
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Calcolo del quoziente
try
int a = Integer.parseInt(filein.readLine());
int b = Integer.parseInt(filein.readLine());
System.out.println( a / b );
}
catch (IOException e)
System.err.println(s + ": unable to read values");
}
catch (NumberFormatException e)
if (e.getMessage().equals("null"))
System.err.println(s + ": need two inputs");
}
else
System.err.println(s + ": invalid inputs");
}
}
catch (ArithmeticException e)
System.err.println(s + ": unexpected 0 input value");
}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Comandi type e cat
La maggior parte dei sistemi operativi fornisce un comando
per elencare il contenuto dei file
Windows: type
Unix, Linux e OS X: cat
type nomefile1 nomefile2 … nomefilen
Visualizza il contenuto di nomefile1 nomefile2 …
nomefilen nella finestra della console
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Metodo main() possibile per Type.java
public static void main(String[] args){
for (int i = 0; i < args.length; ++i) {
BufferedReader filein = new BufferedReader(
new FileReader(args[i]));
String s = filein.readLine();
while (s != null) {
System.out.println(s);
s = filein.readLine();
}
filein.close();
}
}
Che cosa non va?
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Utilizzare un blocco finally
public static void main(String[] args){
for (int i = 0; i < args.length; ++i) {
BufferedReader filein = new BufferedReader(
new FileReader(args[i]));
String s = filein.readLine();
while (s != null) {
System.out.println(s);
s = filein.readLine();
}
filein.close();
}
}
Il file dovrebbe essere chiuso al termine
dell'elaborazione, indipendentemente
dalla causa dell'interruzione
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Utilizzare un blocco finally
try {
String s = filein.readLine();
while (s != null) {
System.out.println(s);
s = filein.readLine();
}
}
catch (IOException e) {
System.err.println(args[i] + ": processing error");
}
Eseguito sempre dopo il completamento del suo
finally {
blocco try-catch
try {
filein.close();
}
catch (IOException e) {
System.err.println(args[i] + ": system error");
}
}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Eccezioni
È possibile creare tipi di eccezioni personali
È possibile lanciare operazioni come garantito
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Attività
Rappresentare il deposito e il prelievo di denaro da un conto
bancario
Quali comportamenti sono necessari?
Costruire un nuovo conto bancario vuoto
BankAccount()
Costruire un nuovo conto bancario con saldo iniziale
BankAccount(int n)
Depositare denaro
addFunds(int n)
Prelevare denaro
removeFunds(int n)
Ottenere il saldo
Int getBalance()
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Utilizzo esemplificativo
public static void main(String[] args)
throws IOException {
BufferedReader stdin = new BufferedReader(
new InputStreamReader(System.in));
BankAccount savings = new BankAccount();
System.out.print("Enter deposit: ");
int deposit = Integer.parseInt(stdin.readLine());
savings.addFunds(deposit);
System.out.print("Enter widthdrawal: ");
int withdrawal = Integer.parseInt(stdin.readLine());
savings.removeFunds(withdrawl);
System.out.println("Closing balance: "
+ savings.getBalance());
}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Attività
Rappresentare il deposito e il prelievo di denaro da un conto
bancario
Quali comportamenti sono necessari?
Costruire un nuovo conto bancario vuoto
BankAccount()
Costruire un nuovo conto bancario con saldo iniziale
BankAccount(int n)
Depositare denaro
Che cosa non va?
addFunds(int n)
Prelevare denaro
removeFunds(int n)
Ottenere il saldo
int getBalance()
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Creare una NegativeAmountException
// Rappresenta un evento anomalo per un conto bancario
public class NegativeAmountException extends Exception {
// NegativeAmountException(): crea un'eccezione con
// messaggio s
public NegativeAmountException(String s) {
super(s);
}
}
La classe Exception fornisce il comportamento delle eccezioni
necessario
La classe NegativeAmountException offre la specializzazione
del tipo di eccezione necessaria
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Utilizzo esemplificativo
public static void main(String[] args)
throws IOException, NegativeAmountException {
BufferedReader stdin = new BufferedReader(
new InputStreamReader(System.in));
BankAccount savings = new BankAccount();
System.out.print("Enter deposit: ");
int deposit = Integer.parseInt(stdin.readLine());
savings.addFunds(deposit);
System.out.print("Enter widthdrawal: ");
int withdrawal = Integer.parseInt(stdin.readLine());
savings.removeFunds(withdrawl);
System.out.println("Closing balance: "
+ savings.getBalance());
}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Classe BankAccount
Variabile istanza
balance
Costruire un nuovo conto bancario vuoto
BankAccount()
Costruire un nuovo conto bancario con saldo iniziale
BankAccount(int n) throws NegativeAmountException
Depositare denaro
addFunds(int n) throws NegativeAmountException
Prelevare denaro
removeFunds(int n) throws NegativeAmountException
Ottenere il saldo
Int getBalance()
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Classe BankAccount
// BankAccount(): costruttore predefinito per saldo vuoto
public BankAccount() {
balance = 0;
}
// BankAccount(): costruttore specifico per nuovo saldo n
public BankAccount(int n) throws NegativeAmountException {
if (n >= 0) {
balance = n;
}
else{
throw new NegativeAmountException("Bad balance");
}
}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Classe BankAccount
// getBalance(): restituisce il saldo corrente
public int getBalance() {
return balance;
}
// addFunds(): deposita l'importo n
public void addFunds(int n) throws NegativeAmountException {
if (n >= 0) {
balance += n;
}
else{
throw new NegativeAmountException("Bad deposit");
}
}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Classe BankAccount
// removeFunds(): preleva l'importo n
public void removeFunds(int n) throws NegativeAmountException
{
if (n < 0) {
throw new NegativeAmountException("Bad withdrawal");
}
else if (balance < n) {
throw new NegativeAmountException("Bad balance");
}
else{
balance -= n;
}
}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Utilizzo di NegativeAmountException
System.out.print("Enter deposit: ");
try {
int deposit = Integer.parseInt(stdin.readLine());
savings.addFunds(deposit);
}
catch (NegativeAmountException e) {
System.err.println(“Cannot deposit negative funds“);
System.exit(0);
}
Java – Guida alla programmazione - James Cohoon, Jack Davidson
Copyright © 2004 - The McGraw-Hill Companies srl
Utilizzo di NegativeAmountException
System.out.print("Enter withdrawal: ");
try {
int withdrawal = integer.parseInt(stdin.readLine());
savings.removeFunds(withdrawl);
}
catch (NegativeAmountException e) {
if (e.message().equals("Bad withdrawal"))
System.err.println(“Cannot withdraw negative
funds“);
else{
System.err.println("Withdrawal cannot leave "
"negative balance");
}
System.exit(0);
}