eccezioni

annuncio pubblicitario
Programmazione a Oggetti e
JAVA
Prof. B.Buttarazzi
A.A. 2012/2013
Sommario
• Gestione degli errori
• Eccezioni
• Categorie di eccezioni
– checked
– unchecked
• Gestione delle eccezioni
– Clausola throws
– Costrutto try - catch - finally
• Lanciare nuove eccezioni
- Comando throw
• Definire nuove eccezioni
• Esercizi
16/01/2013
2
Gestione degli errori
Generalmente i programmi contengono istruzioni “critiche”, che
possono causare errori che portano alla terminazione improvvisa
del programma.
Questa anomalia può dipendere sia dal codice scritto (es. quando
tentiamo di eseguire una divisione per 0, attribuiamo all’indice di
un array un valore al di fuori dell’intervallo consentito, ecc.) sia
dall’ambiente hardware (es. disco pieno, connessione di rete non
disponibile…)
Con altri linguaggi di programmazione per evitare questa eventualità
(errori e conseguente terminazione anomala dei programmi) si cerca di
prevedere e gestire in modo appropriato (inserendo opportuni controlli
if… then con conseguente appesantimento del codice) tutte le
situazioni che possono produrre errori.
16/01/2013
3
Gestione degli errori
Una tipica istruzione “critica” (che può causare la
terminazione improvvisa del programma) è la lettura di
dati da input.
Si ricorda che in Java, il dispositivo standard di input è rappresentato
dalla variabile (statica) System.in, appartenente alla classe InputStream
che fornisce solo il metodo read() (che permette di leggere singoli byte),
pertanto per leggere le stringhe si usa la classe BufferedReader, che
fornisce il metodo apposito readLine()
16/01/2013
4
Ottengo il programma dove sono evidenziati gli errori
16/01/2013
Corso di Fondamenti di Informatica1
5
Ottengo il programma dove sono evidenziati gli errori
Il compilatore ci segnala che potenzialmente nel metodo main sarà generata
una eccezione!
16/01/2013
Corso di Fondamenti di Informatica1
6
Ottengo il programma dove sono evidenziati gli errori
16/01/2013
Corso di Fondamenti di Informatica1
7
Ottengo il programma dove sono evidenziati gli errori
L’istruzione readLine() in caso di errore in
fase di input solleva una IOException
16/01/2013
Corso di Fondamenti di Informatica1
8
Ottengo il programma dove sono evidenziati gli errori
16/01/2013
Corso di Fondamenti di Informatica1
9
Ottengo il programma dove sono evidenziati gli errori
Come suggerito dal compilatore abbiamo aggiunto nella signature del metodo la c
throws dello stesso tipo di eccezione lanciata.
Tramite questa clasusola si demanda al chiamante la gestione dell’eccezione.
16/01/2013
Corso di Fondamenti di Informatica1
10
Istruzione di lettura
..se devo leggere un dato numerico è necessario:
InputStreamReader In = new InputStreamReader(System.in);
BufferedReader Tastiera = new BufferedReader(In);
int numero;
System.out.print("Immettere un numero : ");
numero=Integer.parseInt(Tastiera.readLine());
System.out.println("numero inserito: " + numero);
16/01/2013
11
Istruzione di lettura
..se devo leggere un dato numerico è necessario:
InputStreamReader In = new InputStreamReader(System.in);
BufferedReader Tastiera = new BufferedReader(In);
se la stringa restituita da
readLine() non corrisponde alla sintassi di un
int numero;
numero intero Integer.parseInt() solleva una
NumberFormatException
System.out.print("Immettere un numero : ");
numero=Integer.parseInt(Tastiera.readLine());
System.out.println("numero inserito: " + numero);
16/01/2013
12
Il compilatore ci segnala che potenzialmente nel metodo sarà generata anche una ecc
formato del dato .
16/01/2013
13
Il concetto di eccezione
Java per ovviare ai possibili errori a cui può andare incontro
un programma durante la sua normale esecuzione, adotta un
approccio innovativo, introducendo il concetto di eccezione.
Una eccezione è un evento anomalo e indesiderato che non
consente la normale prosecuzione del programma .
Esempi:
•divisione per 0:
• java.lang.ArithmeticException
•indice di un array al di fuori dell’intervallo consentito
• -java.lang.ArrayIndexOutOfBoundsException
•formato numerico errato
• java.lang.NumberFormatException
16/01/2013
14
Le eccezioni
Una eccezione Java è un oggetto, istanza della classe
Throwable o di una sua sottoclasse.
Le sottoclassi della classe Throwable sono due:
-Exception
-Error
Object
Throwable
Error
16/01/2013
Exception
15
Le eccezioni
Gli errori sono degli eventi
anomali che non dipendono dalla
nostra applicazione (es.: memoria
insufficiente, problemi alla JVM,
problemi con un dispositivo
esterno, ecc.) e pertanto non
possono essere gestiti; infatti,
potenzialmente, qualunque codice
del programma potrebbe lanciare
questi errori che sarebbero
completamente fuori dal controllo
del programmatore.
Object
Le eccezioni, invece, sono l'opposto
degli errori, ovvero, tutti quegli eventi
che dipendono dal programma e che
possono essere controllati e quindi
gestiti.
Throwable
Error
16/01/2013
Exception
16
Categorie di eccezioni
Il compilatore Java suddivide le Exception in due categorie: checked (verificate) e
unchecked (non verificate).
Considera checked (eccezioni verificate), le istanze della classe Exception mentre
unchecked (non verificate) le istanze della classe RuntimeException
Object
Throwable
Error
Exception
RuntimeException
16/01/2013
unchecked exceptions
Checked exception
17
La distinzione tra le eccezioni verificate ( checked exception ) e non verificate (unchecked
exception ) è importante in quanto il compilatore Java, per le eccezioni verificate, richiede il
requisito dichiara (tramite la clausola throws) o intercetta ( try catch).
Tutte le eccezioni che sono sottoclassi dirette o indirette di RunTimeException sono non
verificate (es. ArrayIndexOutOfBounds , ArithmeticException).
Tutte le classi che ereditano da Exception ma non da RuntimeException sono invece considerate
eccezioni verificate.
Il compilatore Java controlla ogni chiamata e dichiarazione di metodo per verificare se il metodo
può lanciare eccezioni verificate.
Object
In caso positivo si assicura che sia soddisfatto
il requisito dichiara (tramite la clausola throws)
o intercetta ( try catch).
Le eccezioni verificate devono obbligatoriamente
essere dichiarte (tramite la clausola throws) o
Throwable
intercettate ( try catch)altrimenti non avviene la compilazione, come visto prima.
Categorie di eccezioni
Exception
RuntimeException
16/01/2013
unchecked exceptions
Checked exception
18
Categorie di eccezioni
Le checked, exception rappresentano situazioni anomale in cui il programma
puo' incappare, ma facilmente recuperabili.
Object
Throwable
Error
Exception
RuntimeException
16/01/2013
unchecked exceptions
Checked exception
19
Categorie di eccezioni
Le unchecked exception possono potenzialmente capitare in qualsiasi programma e in
qualsiasi momento dell'esecuzione (puntatori nulli, divisioni per zero, ecc). Sono
solitamente imputabili a errori di progettazione o a mancati controlli sull'input
dell'utente.
Non devono obbligatoriamente essere gestite.
Object
Throwable
Error
Exception
RuntimeException
16/01/2013
unchecked exceptions
Checked exception
20
Alcune tra le più importanti eccezioni Java:
• NullPointerException extends RunTimeException extends Exception :
eccezione che viene lanciata quando si utilizza un puntatore nullo (Addio caro
vecchio Segmentation Fault!!!).
• ArrayIndexOutOfBoundsException extends
IndexOutOfBoundsException extends RunTimeException extends
Exception : eccezione che viene lanciata quando si legge un array (Vettore o
Lista) con indice non corretto (Ancora: addio caro vecchio Segmentation
Fault!!!).
• NumberFormatException extends IllegalArgumentException extends
RunTimeException extends Exception : eccezione lanciata dalle Classi
Wrapper quando si cerca di convertire in un Numero una stringa non
correttamente Formattata.
• IOException extends exception : eccezione lanciata dalla virtual machine
quando una operazione di Input/Output non va a buon fine
• FileNotFoundException extends IOException extends Exception :
eccezione lanciata quando un file non viene trovato.
Alcune tra le più importanti eccezioni Java:
Categorie di eccezioni
Le eccezioni checked vengono controllate dal compilatore (per questo
si chiamano così), pertanto il compilatore si aspetta che nel metodo
che potenzialmente le genera, ci siano gli appositi costrutti per il
controllo e la gestione (corpo del metodo con costrutto try/catch o
che, nella signature del metodo, ci sia una clausola throws dello stesso
tipo di eccezione lanciata o di una sua superclasse - Se ciò non avviene
si incorre in un errore di compilazione! )
Le eccezioni unchecked sono libere da costrizioni programmative: esse
possono essere lanciate ovunque e, se non gestite, si propagano nello
stack delle chiamate fino a causare la terminazione del programma.
Questo approccio rende i programmi Java
più robusti e affidabili.
16/01/2013
23
Gestione delle eccezioni
Una eccezione è un oggetto Java e può essere:
1. Propagata verso il metodo chiamante che si occuperà di gestire
l’eccezione tramite la clausola
di propagazione nel metodo)
throws (dichiarazione
2. Catturata e gestita tramite il costrutto try/catch
3. Generata da un metodo tramite throw
16/01/2013
24
Il costrutto try - catch
• Il blocco try contiene un insieme di istruzioni che potrebbero
generare eccezioni, se durante l'esecuzione una delle istruzioni
genera un'eccezione, il flusso di esecuzione si interrompe, e la
gestione passa al blocco catch incaricato di gestire l'eccezione
sollevata.
• Il blocco catch specifica quale eccezione si desidera gestire e
quali istruzioni eseguire.
• E' possibile rinserire più blocchi catch, in modo da permettere una
gestione differenziata delle eccezioni generate dal blocco try.
Nell’esempio riportato il compilatore prova (try) ad
eseguire il blocco di istruzioni dopo la parola chiave
try e se incontra un input non corretto lancia
l’eccezione e si ferma!
16/01/2013
25
Il costrutto try - catch
Un blocco try deve avere almeno un catch o finally;
Se sono possibili più tipi di errore ci saranno più blocchi catch.
Il corpo del blocco try viene eseguito fino al momento in cui viene
sollevata un’eccezione da un’istruzione; a quel punto viene esaminata
ogni clausola catch per vedere se il tipo dell’eccezione sollevata
coincide con quella trattata dal blocco catch; se esiste il catch
corrispondente , viene inizializzato l’identificatore (il parametro
enamexxx) e vengono eseguite le istruzioni; nessuna altra catch verrà
eseguita
se non viene trovata nessuna catch adatta, l’eccezione è
propagata al di fuori del try, ad altri try più esterni se presenti.
Se è presente una finally, le sue istruzioni sono eseguite comunque,
anche in assenza di eccezioni; la finally è solitamente usata per
attuare e garantire la coerenza dello stato degli oggetti (ad
esempio, chiudere file)
Si noti che l’ordine delle catch è rilevante;
Es.
try {
…
}
catch(NullPointerException npe) {}
catch(IOExcetpion ioe) {}
catch(Exception e) {}
Si noti che la gestione di IOException deve precedere quella di Exception,
dato che IOException è una sottoclasse di Exception.
Per la stessa ragione, la gestione di Exception deve per forza comparire in
fondo all'elenco.
Il costrutto try - catch
16/01/2013
28
Gestione delle eccezioni:esempio 1
16/01/2013
29
Gestione delle eccezioni:esempio
16/01/2013
30
Gestione delle eccezioni:esempio
Se durante l'esecuzione diamo un
input sbagliato (la stringa tre), viene
lanciata dal metodo main
un'eccezione che viene intercettata
dalla JVM che manda un messaggio
e interrompe l’esecuzione del
programma
16/01/2013
31
Gestione delle eccezioni:esempio
Il messaggio mostra :
•la stringa di input che ha causato l’errore
•la linea di codice in cui è stata lanciata l’eccezione (20)
•le chiamate dei metodi che hanno portato all’eccezione
16/01/2013
32
Gestione delle eccezioni:esempio
Se si inserisce un dato numerico con
formato errato viene lanciata l’eccezione
NumberFormatExceoption (unchecked)
16/01/2013
33
Gestione delle eccezioni:esempio
Il compilatore Java non verifica se un’eccezione non
verificata (unchecked) viene intercettata o dichiarata.
Le eccezioni non verificate possono essere prevenute
(evitate) con codice appropriato.
16/01/2013
34
La gestione delle eccezioni è utile in fase di debugging in quanto
Da informazioni sul verificarsi di anomalie
Il messaggio mostra :
•la stringa di input che ha causato l’errore
•la linea di codice in cui è stata lanciata l’eccezione (20)
•le chiamate dei metodi che hanno portato all’eccezione
16/01/2013
35
Per evitare che il programma si interrompa possiamo provare a
racchiudere il comando di input in un blocco try-catch:
Il messaggio mostra :
•la stringa di input che ha causato l’errore
•la linea di codice in cui è stata lanciata l’eccezione (20)
•le chiamate dei metodi che hanno portato all’eccezione
16/01/2013
36
16/01/2013
37
Anche in questo caso il programma si interrompe!
Per evitare questo comportamento (il blocco dell’esecuzione del
programma) dobbiamo fare diversamente! Ad esempio possiamo
racchiudere il try-catch in un blocco do while:
16/01/2013
38
Gestione delle eccezioni:esempio 2
16/01/2013
39
package provaeccezioni;
import java.io.BufferedReader;
import java.io.InputStreamReader;
Altro esempio di gestione delle eccezioni
Si distinguono i diversi tipi di eccezioni
Si tenta il recupero di situazioni di errore
public class prova6 {
public static void main(String args[]) {
InputStreamReader In = new InputStreamReader(System.in);
BufferedReader Tastiera = new BufferedReader(In);
int d=0, a=0;
do{
System.out.println("Inserire a <immettere un numero maggiore di 0>: ");
try {
a=Integer.parseInt(Tastiera.readLine());
} catch(Exception e1) {System.out.println("errore nell'inserimento di a " ); };
System.out.println("numero inserito: " + a);
} while (a<=0);
boolean errore=false;
do{
errore=false;
System.out.println("Inserire d <immettere un numero maggiore di 0>: ");
try {
d=Integer.parseInt(Tastiera.readLine());
} catch(Exception e2) {System.out.println("errore nell'inserimento di d" );errore=true;};
}while (errore);
try {
}
}
System.out.println("numero inserito: " + d);
a = 42 / d;
System.out.println("valore calcolato :"+a);
} catch (ArithmeticException e) {
System.out.println("Divisione per zero");};
16/01/2013
40
package provaeccezioni;
import java.io.BufferedReader;
import java.io.InputStreamReader;
Importante :
la clausola throws non è
presente nel main in quanto
è presente il costrutto try
catch per la gestione delle
eccezioni
public class prova6 {
public static void main(String args[]) {
InputStreamReader In = new InputStreamReader(System.in);
BufferedReader Tastiera = new BufferedReader(In);
int d=0; a=0;
do{
System.out.println("Inserire a <immettere un numero maggiore di 0>: ");
try {
a=Integer.parseInt(Tastiera.readLine());
} catch(Exception e1) {System.out.println("errore nell'inserimento di a " ); };
System.out.println("numero inserito: " + a);
}
while (a<=0);
booleanerrore=false;
do{
errore=false;
System.out.println("Inserire d <immettere un numero maggiore di 0>: ");
try {
d=Integer.parseInt(Tastiera.readLine());
} catch(Exception e2) {System.out.println("errore nell'inserimento di d" );errore=true;};
}
while (errore);
System.out.println("numero inserito: " + d);
try {
a = 42 / d;
System.out.println("valore calcolato :"+a);
} catch (ArithmeticException e) {
System.out.println("Divisione per zero");};
}
}
16/01/2013
41
Costrutto try – catch - finally
Il costrutto generale per la gestione delle eccezioni ha la seguente
forma:
try {
istruzione1();
Parte normale!!
istruzione2();
....
}
catch(Exception1 e1) {
// gestione dell'eventuale problema nato nel blocco try
}
Anche più di una!!
catch(Exception2 e2) {
// gestione dell'eventuale problema nato nel blocco try
}
finally {
Facoltativa!!
// codice da eseguire comunque al termine del blocco try
}
16/01/2013
La clausola finally contiene un blocco di istruzioni da
eseguire comunque dopo il blocco try, sia nel caso
esso sia terminato senza problemi, sia nel caso
abbia sollevato qualche eccezione.
42
L’istruzione throw
Fino ad ora abbiamo visto
• (throws ) che permette di delegare al metodo chiamante la
gestione delle eccezioni che potrebbero essere sollevate, oppure
• (try - catch ) che permette di gestire le eccezioni che potrebbero
essere sollevate in un metodo all’interno del metodo stesso
Ora invece vedremo come si opera se si desidera generare
un'eccezione in un metodo e in che modo sia possibile
creare eccezioni personalizzate per gestire situazioni
anomale nei propri programmi.
 Utilizzeremo come esempio un metodo statico che calcola il fattoriale.
 Il metodo crea una nuova eccezione nel caso che il parametro di input sia negativo !
16/01/2013
43
L’istruzione throw
Le eccezioni possono essere generate con l’istruzione throw
Solitamente un’istruzione throw è inclusa in un’istruzione if
che valuta una condizione per verificare se deve essere
sollevata l’eccezione
16/01/2013
44
L’istruzione throw
16/01/2013
45
L’istruzione throw
package provaeccezioni;
import java.io.*;
public class prova7 {
static int fattoriale(int n) throws Exception {
if(n<0)
throw new Exception("Il parametro deve essere
int f = 1;
for (int i=1;i<=n;i++) f = f * i;
return f;
}
16/01/2013
positivo");
Importante non confondere:
la clausola throws che dichiara che un
metodo rilancia all’esterno un’eccezione
l’istruzione throw che solleva
un’eccezione
46
Altro esempio
package provaeccezioni;
import java.io.*;
public class prova3 {
public static void main(String[] args) throws Exception {
InputStreamReader In = new InputStreamReader(System.in);
BufferedReader Tastiera = new BufferedReader(In);
int x=0;
do{
System.out.print("Immettere un numero maggiore di 0: ");
try {
x=Integer.parseInt(Tastiera.readLine());
} catch(Exception e) {System.out.println("errore " );
}
}while (x<=0);
System.out.println("numero inserito: " + x);
if (x==5) throw new Exception("Impossibile usare il valore 5");
}
}
16/01/2013
47
Esempio
Per generare un’eccezione: prima si crea l’oggetto eccezione
da lanciare poi lo si lancia con l’istruzione throw
public int readInteger(String s) throws
NumberFormatException,
NumberTooBigException {
int x = Integer.parseInt(s);
if (x>100)
throw new NumberTooBigException();
return x;
}
package provaeccezioni;
import java.io.*;
public class prova3 {
public static void main(String[] args) throws Exception {
InputStreamReader In = new InputStreamReader(System.in);
BufferedReader Tastiera = new BufferedReader(In);
int x=0;
do{
System.out.print("Immettere un numero maggiore di 0: ");
try {
x=Integer.parseInt(Tastiera.readLine());
} catch(Exception e) {System.out.println("errore " );
}
}while (x<=0);
System.out.println("numero inserito: " + x);
if (x==5) throw new Exception("Impossibile usare il valore 5");
}
}
l’istruzione throw genera un’eccezione
16/01/2013
49
Eccezioni definite dall’utente
Nonostante l’enorme varietà di eccezioni già presenti in Java, il programmatore può
facilmente crearne di proprie, qualora desideri segnalare condizioni di eccezione
tipiche di un proprio programma.
Per creare una nuova eccezione è sufficiente dichiarare una sottoclasse di Exception (o di
una qualunque altra eccezione esistente), e ridefinire i costruttori.
• Exception(): Crea un'eccezione.
• Exception(String message): Crea un'eccezione specificando un messaggio diagnostico.
Esempio di eccezione personalizzata:
public class MiaEccezione extends Exception{
MiaEccezione (String messaggio)
{ super (messaggio); }
}
}
16/01/2013
Questa classe si deve trovare in un file chiamato
come la classe, ovvero “MiaEccezione.java".
50
Come sollevare la nuova eccezione
import java.io.*;
public class UsaMiaEccezione {
public static void main(String[] args) throws MiaEccezione, IOException {
/* lista delle sottoclassi di Exception che possono essere lanciate dal metodo */
final int Min = 10, Max = 30;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Introduci un numero tra "+Min +" e " +Max+ " inclusi");
int valore = Integer.parseInt(br.readLine());
if (valore < Min || valore > Max)
throw new MiaEccezione ("il valore non è nell'intervallo");
System.out.println("Non è stata lanciata l'eccezione");
}
}
16/01/2013
51
Come sollevare la nuova eccezione
import java.io.*;
public class UsaMiaEccezione {
public static void main(String[] args) throws MiaEccezione, IOException {
/* lista delle sottoclassi di Exception che possono essere lanciate dal metodo */
final int Min = 10, Max = 30;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Introduci un numero tra "+Min +" e " +Max+ " inclusi");
int valore = Integer.parseInt(br.readLine());
if (valore < Min || valore > Max)
throw new MiaEccezione ("il valore non è nell'intervallo");
System.out.println("Non è stata lanciata l'eccezione");
Quindi
} con la clausola throws avviso il compilatore che questo metodo potrebbe
lanciare
questa tipologia di eccezione
}
Nel codice verifico se è il caso o no di lanciare l’eccezione in caso affermativo
creo l’oggetto eccezione da lanciare (new..) e con l'istruzione throw lo lancio.
16/01/2013
52
Esercizio
Data la classe Tempo di seguito riportata,
modificarla in modo tale che se il metodo
assegnaTempo riceve parametri errati, generi
un'eccezione.
16/01/2013
53
Classe Tempo
public class Tempo {
protected int ore, minuti, secondi;
static public char separatore = ':';
public Tempo () {
// costruttore
ore = minuti = secondi = 0;
}
16/01/2013
54
Classe Tempo
public Tempo (int ora, int minuto, int secondo) {
// costruttore
s();
assegnaTempo (ora, minuto, secondo);
}
public int assegnaTempo (int ora,
int minuto, int secondo){
if (ora >= 0 && ora < 24 && minuto >= 0 &&
minuto < 60 && secondo >= 0 && secondo < 60 ){
ore = ora;
minuti = minuto;
secondi = secondo;
return 0;
} else
return -1;
}
public int leggiOra () {
return ore;
}
16/01/2013
55
Classe Tempo
public int leggiMinuti () {
return minuti;
}
public int leggiSecondi () {
return secondi;
}
public void aggiungiOre (int numOre) {
ore = ore + numOre;
while (ore > 23)
ore = ore - 24;
}
public void visualizza (boolean ritornoACapo) {
System.out.print("" + ore + separatore
+ minuti + separatore);
16/01/2013
56
Classe Tempo
/* La stringa vuota ("") come argomento di System.out.print
serve per forzare l'interpretazione di + come operatore di
concatenazione di stringhe */
if (ritornoACapo)
System.out.println (secondi);
else
System.out.print (secondi);
}
}
16/01/2013
57
Soluzione
Estendiamo Tempo.java in modo che se il metodo assegnaTempo riceve parametri errati, genera
un'eccezione.
public class TempoConEccezioni extends Tempo{
public TempoConEccezioni() {
super();
}
public TempoConEccezioni (int ora, int minuto, int secondo) {
super (ora, minuto, secondo);
}
public int assegnaTempo (int ora,
int minuto, int secondo){
if (super.assegnaTempo(ora,minuto,secondo) == 0)
return 0;
else throw new TempoException("Errore in assegnatempo");
}
16/01/2013
58
Soluzione
Definiamo la classe di eccezioni TempoException:
public class TempoException extends
RuntimeException{
public TempoException(){
super();
}
public TempoException(String msg){
super(msg);
}
}
16/01/2013
59
Soluzione
Proviamo la nuova classe con un semplice programma:
public class UsaTempoConEccezioni{
public static void main(String
[] args) {
try {
Tempo t = new TempoConEccezioni (99,99,99);
t.visualizza(true);
} catch (TempoException e) {
System.out.println ("Errore:" + e);
}
}
}
16/01/2013
60
Esercizio
Modificare la classe Conto Corrente che nel caso
l’importo da prelevare superi il saldo lanci una
eccezione di IllegalArgumentException abbinata
al seguente messaggio: ("somma non
disponibile");} senza bloccare l’esecuzione del
programma
16/01/2013
61
Soluzione
public class ContoCorrente{
public static double preleva(double somma,double disp){
if(somma>disp) {
throw new IllegalArgumentException("somma non
disponibile");}
disp=disp-somma; return disp;}
public static void main(String[]args){
double disponibile = 2000.00; //denaro disponibile in
CC
Scanner sc= new Scanner(System.in);
System.out.println("Somma disponibile in cc:" +
disponibile);
int termina = 1;
16/01/2013
62
Soluzione
while(termina!=0) {System.out.println("Quale somma vuoi
prelevare?");
double sommaDaPrelevare= sc.nextDouble();
try
{disponibile = preleva(sommaDaPrelevare, disponibile);}
catch(IllegalArgumentException)
{System.out.println("Problema: "+ e +"prelevamento
massimo: " + disponibile);}
System.out.println("Somma disponibile in cc:" +
disponibile);
System.out.println("Digita 1 per continuare, 0 per
uscire");
termina = sc.nextInt();}}}
16/01/2013
63
Esercizio
Definire una classe cc che ha la funzione
di una Calcolatrice che nel caso venga
impostata una operazione non valida lanci
una eccezione adeguata.
Provare a gestire le eccezioni in modo
che il programma non termini in modo
anomalo
16/01/2013
64
public class cc
{
public cc(){}
public double dividi( double op1, double op2) throws Exception {
if( op2 == 0)
{throw new Exception("Impossibile dividere per 0.");
}
return op1/op2; }}
16/01/2013
65
public class Calcolatrice
{
public static void main(String[] args)
{
try
{
cc calc = new cc();
double op1 = 3.2;
double op2 = 0.0;
double ris_divisione = calc.dividi( op1, op2 );
System.out.println(op1+" diviso "+op2+" fa: "+ris_divisione);
}
catch(Exception e)
{ System.out.println("La calcolatrice ha riportato una operazione non valida."+e);}
}}
16/01/2013
66
16/01/2013
67
16/01/2013
68
Cosa abbiamo imparato?
• Cosa sono le eccezioni:eventi anomali ed indesiderati
che non permettono la normale prosecuzione del
programma.
• Le categorie di eccezioni e la differenza tra eccezioni:
checked: controllate dal compilatore, sono tutte
le sottoclassi della classe Exception e la loro
gestione è obbligatoria;
unchecked: libere da costrizioni programmative,
sono tutte le sottoclassi della classe
RuntimeException e la loro gestione è
opzionale. Possono essere generate ovunque.
• L’eccezione può essere:
Propagata verso il metodo chiamante tramite la
16/01/2013
69
dichiarazione nel metodo throws;
Catturata e gestita tramite il costrutto try/catch;
Generata da un metodo tramite throw.
• Come si utilizza la clausola throws: delega la
gestione delle eccezioni
che potrebbero essere
sollevate da un metodo al metodo chiamante.
• Che cos’è il costrutto try/catch: gestisce le eccezioni
che potrebbero essere sollevate in un metodo
all’interno del metodo stesso.
- try contiene un’insieme di istruzioni che possono
generare un’eccezione;
- catch specifica quale eccezione si desidera gestire
e quale istruzioni eseguire. E’ possibile ripetere più
volte
il blocco catch.
16/01/2013
70
• La clausola finally contiene un blocco di istruzioni da
eseguire comunque dopo il blocco try.
• Come si genera un’eccezione tramite l’istruzione
throw.
16/01/2013
71
Questionario
1) Che cos’è un’eccezione?
□ E’ un metodo particolare in Java;
□ E’ un evento imprevisto, anomalo e indesiderato che non consente
la normale prosecuzione del programma;
□ E’ evento un previsto e desiderato che si utilizza in alcuni tipi di
programmi;
□ E’ una classe particolare in Java.
2)A cosa serve l’istruzione throws?
□ throws serve per gestire un’eccezione unchecked;
□ throws serve a dichiarare che in questo metodo potrebbero essere
sollevate delle eccezioni di cui ne viene demandata la gestione al
chiamante del metodo;
□ throws serve a gestire le eccezioni che potrebbero essere sollevate
in un metodo all’interno del metodo stesso;
□ throws serve a generare un’eccezione.
16/01/2013
72
3)Che cos’è un’eccezione in Java?
□ Una classe;
□ Un oggetto;
□ Un metodo;
□ Un package.
4)A cosa servono le istruzioni try/carch?
□ try/catch servono per gestire un’eccezione unchecked;
□ try/catch servono a dichiarare che in questo metodo potrebbero
essere sollevate delle eccezioni di cui ne viene demandata la
gestione al chiamante del metodo;
□ try/catch serve a gestire le eccezioni che potrebbero essere
sollevate in un metodo all’interno del metodo stesso;
□ try/catch serve a generare un’eccezione
5) ) Le eccezioni in Java, di quale istanza di classi fanno parte?
□ delle classi java.lang.Exception e sue sottoclassi e di
java.lang.RuntimeException e sue sottoclassi;
16/01/2013
73
□ delle classi java.io.Exception e sue sottoclassi
□ delle classi java.error.Exceptione e sue sottoclassi e di
java.error.RuntimeException e sue sottoclassi;
□ delle classi java.io.Exceptione e sue sottoclassi e di
java.io.RuntimeException e sue sottoclassi
6) Cosa significano le parole checked e unchecked e a quale
classe fanno riferimento?
□ checked sono eccezioni controllate che sono istanze della classe
java.lang.Exception, mentre unchecked sono eccezioni non controllate
e sono istanze della classe java.lang.RuntimeException;
□ checked sono eccezioni non controllate che sono istanze della classe
java.lang.Exception, mentre unchecked sono eccezioni controllate e
sono istanze della classe java.lang.RuntimeException;
□ checked sono eccezioni controllate che sono istanze della classe
java.lang.RuntimeException, mentre unchecked sono eccezioni non
controllate e sono istanze della classe java.lang.Exception;.
16/01/2013
74
□ checked sono eccezioni non controllate che sono istanze della classe
java.lang.RuntimeException, mentre unchecked sono eccezioni
controllate e sono istanze della classe java.lang.Exception
7)A cosa serve l’istruzione finally dopo un blocco try?
□ il blocco finally è obbligatorio e contiene istruzioni che vengono
comunque eseguite sia che sia stata che non sia stata sollevata
un’eccezione;
□ il blocco finally è facoltativo e contiene istruzioni che vengono
comunque eseguite sia che sia stata che non sia stata sollevata
un’eccezione;
□ il blocco finally è facoltativo e contiene istruzioni che vengono
eseguite solo se sia stata sollevata un’eccezione;
□ il blocco finally è facoltativo e contiene istruzioni che vengono
eseguite solo se non sia stata sollevata un’eccezione.
16/01/2013
75
8)Qual è la differenza tra le eccezioni checked e unchecked?
□ Non c’è nessuna differenza sono entrambe libere da costrizioni
programmative;
□ Non c’è nessuna differenza sono entrambe controllate dal compilatore;
□ Le eccezioni checked vengono controllate dal compilatore, mentre le
eccezioni unchecked sono libere da costrizioni programmative;
□ Le eccezioni checked sono libere da costrizioni programmative, mentre
le eccezioni unchecked vengono controllate dal compilatore.
9)Quale dei seguenti costrutti per la gestione delle eccezioni è
giusto?
□ try{
istruzione1();
istruzione2();....}
catch(Exception1 e1) {
// gestione dell'eventuale problema nato nel blocco try}
catch(Exception2 e2) {
// gestione dell'eventuale problema nato nel blocco try};
16/01/2013
76
□ finally{
// codice da eseguire comunque al termine del blocco try}
try{
istruzione1();
istruzione2();....}
catch(Exception1 e1) {
// gestione dell'eventuale problema nato nel blocco try}
catch(Exception2 e2) {
// gestione dell'eventuale problema nato nel blocco try};
□ try{
istruzione1();
istruzione2();....}
try{
istruzione1();
istruzione2();....}
catch(Exception1 e1) {
// gestione dell'eventuale problema nato nel blocco try};
16/01/2013
77
□ try{
try{
istruzione1();
istruzione2();....}
istruzione1();
istruzione2();....}
catch(Exception1 e1) {
// gestione dell'eventuale problema nato nel blocco try}
catch(Exception2 e2) {
// gestione dell'eventuale problema nato nel blocco try};
10)Quale dei seguenti non è un modo per gestire le eccezioni?
□ Un’eccezione può essere catturata e gestita all’interno di un metodo
tramite il costrutto try/catch;
□ Un’eccezione può essere generata all’interno di un metodo tramite il
costrutto throw;
□ Un’eccezione può essere generata all’interno di un metodo tramite il
costrutto throws;
16/01/2013
78
□ Un’eccezione può essere propagata verso il metodo chiamante che può
catturare e gestire l’eccezione o continuare la propagazione tramite la
definizione del metodo throws.
11) Nel main, per gestire le eccezioni, quale tipo di costrutto
viene utilizzato? □ try/catch;
□ throws;
□ throw;
□ java.io.IOException.
12)Quale classe si trova in cima alla gerarchia delle eccezioni? □
Throwable;
□ Error;
□ Exception;
□ Runtime Exception.
16/01/2013
79
13)Cosa succede se un’eccezione non viene intercettata?
□ Nulla, il programma viene eseguito ugualmente ;
□ Si verifica un’interruzione anomala del programma;
□ Un’eccezione viene sempre intercettata dalla JVM;
□ Il programma viene eseguito ma in maniera errata.
14)Quali sono le due dirette sottoclassi di Throwable?
□ Exception e RuntimeException;
□ Error e Exception;
□ Error e RuntimeException;
□ checked e unchecked.
15)Quali dei seguenti modi non può generare un’eccezione?
□ Un’eccezione può essere generata esplicitamente con l’istruzione
throws;
□ Un’eccezione può essere generata da un errore nella JVM;
□ Un’eccezione può essere generata da un errore nel programma;
□ Un’eccezione può essere generata esplicitamente con l’istruzione
throw.
16/01/2013
80
Scarica