Eccezioni Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – 53100 – SIENA Uff. 0577233606

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

Introduzione al linguaggio C++
INFORMATICA Altre Istruzioni di I/O
Java base V: La gestione delle Eccezioni
Costruttori e Distruttori
Recupero debito quarto anno Primo incontro
Universita di Camerino
Informatica 2 Lezione 4 Corso di laurea in matematica Informatica 2 Dott. Ing. Leonardo Vito Corso di laurea matematica indirizzo matematica per le applicazioni.
Java: programmazione concorrente con condivisione di memoria
Differenze nei vari linguaggi di Elisa Trifirò e Barbara Tacchino
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Classi ed Oggetti in Java (Cenni). Richiami Ruolo delle Classi in Java Oggetti.
LIP: 4 Aprile 2008 ECCEZIONI. Eccezioni Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
Le gerarchie di tipi.
LIP: 19 Aprile Contenuto Soluzione Compitino Tipo di dato MultiSet, estensione con sottoclasse.
PolyFun. Dare implementazione,funzione di astrazione, invarianti della rappresentazione. Provare che i metodi apply e bind preservano gli invarianti.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
2 luglio 2006URM2 – ING- OOP0304 OL G. Cantone e A. Lomartire 1 Programmazione Orientata agli Oggetti Processi, task e thread Java (ed esempi) Università
Programma Dott. Ing. Leonardo Rigutini
Applet Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – – SIENA Uff
Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – – SIENA.
Grafica Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – – SIENA Uff
Fisica computazionale I - 21 OPERATORI. Fisica computazionale I - 22 OGGETTI Gli oggetti sono strutture di dati che possono essere create, attraverso.
Specifiche senza JML: uso delle asserzioni. 2 Asserzioni in Java Dal jdk 1.4 (da Febbraio 2002) cè meccanismo per gestire asserzioni Asserzione: espressione.
AA 2005/06 Informatica Programmazione M.A. Alberti-L. Capra 1 Le eccezioni in Java Programmazione Corso di laurea in Informatica.
AA2003/04 © M.A. Alberti Programmazione Eccezioni 1 Le eccezioni in Java Programmazione Corso di laurea in Informatica.
1 Le gerarchie di tipi. 2 Supertipi e sottotipi 4 un supertipo –class –interface 4 può avere più sottotipi –un sottotipo extends il supertipo ( class.
memoria gestita staticamente:
Eccezioni.
Concetti di informatica e fondamenti di Java, 4 ed.Apogeo ©2007 Capitolo 11 Ingresso/uscita e gestione delle eccezioni Cay S. Horstmann Concetti di informatica.
Sistemi Operativi GESTIONE DEI PROCESSI.
GESTIONE DEGLI ERRORI Spesso vi sono istruzioni critiche, che in certi casi possono produrre errori. Lapproccio classico consiste nellinse- rire controlli.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
1 Lucidi delle esercitazioni di Sistemi di Elaborazione in Rete Università degli Studi della Calabria Corso di Laurea in Ingegneria Gestionale A.A. 2003/2004.
BIOINFO3 - Lezione 331 SUBROUTINE IN PERL Una subroutine (funzione, metodo, procedura o sottoprogramma), e` una prozione di codice all`interno di un programma.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA FINALE DEL 21 MAGGIO 2007 NOME: COGNOME: ________________________________________________________________________________.
Corso JAVA Lezione n° 12 Istituto Statale di Istruzione Superiore “F. Enriques”
1 Applet ed HTML Fondamenti di Informatica Corso D.
Le eccezioni F. Bombi 01/11/ Errori e situazioni impreviste situazioni eccezionali In un programma situazioni eccezionali possono.
Astrazione procedurale ed eccezioni
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Variabili Numeriche –Interi (byte, short, int, long): complemento a 2 –A virgola mobile (float, double): IEEE 745 Alfanumeriche –Carattere (char): Unicode.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Capitolo 6 Iterazione Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies.
Eccezioni Metodi parziali Eccezioni: Usi e Metodi parziali Eccezioni: rimuovere i requires Eccezioni: rimuovere i requires Eccezioni: definizione, sollevamento,
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
1 Eccezioni in Java. 2 Ricordiamo che 4 una procedura può terminare –normalmente, ritornando un risultato –in modo eccezionale ci possono essere diverse.
Programmazione in Java
13 ottobre Decisioni F. Bombi 13 ottobre 2002.
Primo Compitino Primo esercizio Identificare gli errori segnalati dal compilatore Verifica statica del codice Regole di binding per i nomi (quelle.
10/12/2004Laboratorio di Programmazione - Luca Tesei1 Gestione delle eccezioni.
Ese 1 (del 31 Marzo 2004). Il compilatore Non esegue il programma, non guarda i valori che possono assumere di volta in volta le variabili, non fa assunzioni.
1 Astrazione procedurale ed Eccezioni. 2 Procedure stand alone 4 indipendenti da specifici oggetti 4 come si realizzano in Java –metodi statici definiti.
Programmazione in Java. Classi I programmi in Java consistono di classi. Le classi consentono di definire: collezioni di procedure (metodi statici) tipi.
Ese 3 (del 3 Aprile 2003). Testo Progettare la specifica e l’implementazione del tipo di dato astratto modificabile Stack, supponendo che gli elementi.
LIP: 22 Marzo 2005 Eccezioni. Eccezioni-Richiami Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
Cose nuove di Java (prima a chiacchiera, poi formalmente)
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Progettare una classe 21 Febbraio La classe BankAccount Vogliamo realizzare una classe i cui oggetti sono dei semplici conti bancari. * Identifichiamo.
Ese 1 e 3 (del 6 Aprile 2005). Primo Ese Si identifichino gli errori che il compilatore segnalerebbe per il seguente programma Tipi Legami tra dichiarazioni.
LIP: 11 Maggio 2007 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Esercitazione sull’ ordinamento 20 maggio 2003
10/10/20021 Ingresso e uscita in Java F. Bombi 10 ottobre 2002.
13/08/02Input 1 Interagire con il computer Da tastiera Da riga di comando Funzioni di conversione.
Suggerimenti [1d5] SE la prima lettera della matrice (in alto a sinistra, matrice[0,0]) è diversa dalla prima lettera della parola (parola[0]) ALLORA siamo.
1 Metodo I metodi sono uno strumento che i programmatori usano per strutturare i programmi, sia per renderli più facili da capire che per permettere il.
1 Input / Output Spesso un programma deve acquisire dati da una sorgente esterna o inviare informazioni a una destinazione esterna. L’informazione puo’
Eccezioni in Java. Le eccezioni in Java Exception handling: insieme di costrutti e regole sintattiche e semantiche presenti nel linguaggio allo scopo.
Transcript della presentazione:

Eccezioni Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – – SIENA Uff

Eccezioni

Gestione errori Un fallimento nel programma può avere diverse cause: Dati errati in ingresso Errori di programmazione Ecc … Due aspetti nella gestione dei fallimenti: Individuazione : rilevare un fallimento Ripristino : ripristinare il programma in modo che possa continuare (gestire lerrore) Il problema maggiore nella gestione degli errori è che solitamente il punto in cui viene individuato lerrore non è accoppiato al punto di ripristino, cioè il punto dove viene gestito lerrore

Gestione errori Per esempio: se nella classe Integer utilizziamo il metodo parseInt per trasformare una String in un int, ma la stringa che attualmente stiamo esaminando non rappresenta un numero (es. pippo), abbiamo un errore (a run-time) ma il metodo parseInt non è in grado di decidere cosa fare: chiedere allutente ? Terminare bruscamente il programma ? Il più delle volte quindi, lerrore verificatosi dentro un metodo deve essere riportato allesterno del metodo stesso: Ritornando un valore particolare (per esempio false, -1) Lanciando una ecezione

Ritorno di un valore particolare E possibile notificare lavvento di un errore dentro una funzione facendo in modo che tale funzione ritorni un valore se tutto viene eseguito in maniera corretta, un altro altrimenti: Es. il metodo drive(int km) di Auto, ritorna 0 se è finita la benzina, > 0 altrimenti. I problemi di questo approccio : diventa necessario ogni volta controllare i valori di ritorno delle funzioni per verificare se sono occorsi errori o meno. In ogni funzione è necessario controllare che ogni istruzione (o quasi) sia eseguita in maniera corretta Inoltre ritornando un tipo di dato semplice (int o boolean) nessuna informazione può essere estratta dallerrore: La cosa da fare sarebbe di creare una classe apposita che sia ritornata da ogni metodo e che memorizzi le informazioni sugli errori

Lanciare un eccezione Lalternativa alluso di valori di ritorno delle funzioni, è di lanciare particolari eventi che segnalano in maniera asincrona il verificarsi dellerrore: Le eccezioni Le eccezioni sono classi particolari di Java che memorizzano lerrore e vengono lanciate e catturate allinterno del programma: Lanciare un eccezione quando avviene un errore Catturare leccezione per gestire lerrore Per lanciare una eccezione si usa la parola riservata throw

Eccezioni Il java fornisce una serie di classi built-in per gestire le eccezioni, tutte derivate dalla classe Exception: Exception IOException UnknownHostException MalformedURLException FileNotFoundException EOFException ClassNot Found Exception CloneNot Supported Exception RuntimeException Aritmetic Exception ClassCast Exception NullPointer Exception …

Es. Supponiamo di progettare la funzione drive() della classe Auto in modo che notifichi il fatto che vogliamo percorrere più km di quanti ne possiamo fare con la benzina rimasta nel serbatoio class Auto { // public void drive(double km) { double c= km/consumo; if (c > carburante) throw new Exception(Not enough gas); carburante=-c; } Lancia una eccezione generica Exception

Eccezioni In alternativa è possibile ovviamente derivare classi per le eccezioni che riguardano il nostro progetto Per esempio noGasException: class noGasException extends Exception { } class Auto { // public void drive(double km) { double c= km/consumo; if (c > carburante) throw new noGasException (Not enough gas); carburante=-c; }

Oggetti Exception Essendo una classe, ogni eccezione può essere memorizzata in una variabile oggetto: class noGasException extends Exception { } class Auto { // public void drive(double km) { double c= km/consumo; noGasException E; if (c > carburante) { E=new noGasException (Not more gas); carburante=0; throw E; } carburante=-c; } variabile E memorizza un oggetto eccezione di tipo noGasException

Classe Error Esiste una seconda categoria di errori interni che vengono segnalati lanciando oggetti di tipo Error. Questi errori sono errori fatali che accadono di rado e non sono controllabili dal programmatore. Ad esempio lerrore OutOfMemoryError, che viene lanciato quando non vi è più memoria disponibile. Tali situazioni non sono gestibili dal programmatore

Lanciare una eccezione Quando viene lanciata una eccezione, il metodo termina immediatamente la propria esecuzione, come se fosse stato eseguito un return. Lesecuzione non procede nel metodo che aveva invocato quella funzione, ma nel gestore delleccezione. E buona regola non abusare del lancio di eccezioni: consideriamo la funzione readLine della classe BufferedReader. Questa funzione legge una riga (fino a \n) da un input stream. Questa funzione non ritorna una eccezione di tipo EOFException quando arriva in fondo allo stream. Perché? La risposta è che terminare lo stream non è una cosa eccezionale, cioè se si legge un file, è ovvio che prima o poi si arriva alla fine del file e quindi trovare EOF non è da considerarsi errore

Eccezioni controllate e non-controllate Le eccezioni Java rientrano in due categorie, chiamate eccezioni controllate e non controllate Eccezioni controllate – quando chiamate un metodo che lancia una eccezione controllata, dovete specificare come gestire leccezione nel caso essa venga lanciata. Ad esempio tutte le eccezioni IOException sono eccezioni controllate. Eccezioni non controllate – il compilatore non richiede che teniate traccia delle eccezioni non controllate come NullPointerException, NumberFormateException ecc … Più in generale tutte le eccezioni che appartengono alle sottoclassi di RuntimeException sono eccezioni non controllate, mentre tutte la altre sottoclassi di Exception sono controllate.

Eccezioni controllate e non controllate Perché ci sono due tipi di eccezioni? Un eccezione controllata descrive un problema che prima o poi può accadere, indipendentemente da quanto sia stato scritto bene il codice Le eccezioni non controllate, invece, rappresentano un errore in programmazione. Quindi diventa inutile forzare la gestione di una eccezione di questo tipo, poiché nel caso si verifichi, è necessario modificare il codice. Ad esempio: La fine inattesa di un file (EOFException) non dipende da cause che sono sotto il nostro controllo (errore sul disco o errore di rete) e quindi si è forzati a prevedere una routine di gestione di tali situazioni Un nullPointerException, invece, segnala un accesso ad una variabile non inizializzata (null) e quindi un errore nel codice che cerca di utilizzare un riferimento null. Il compilatore non verifica che gestiate un nullPointerException poiché dovreste scrivere codice che eviti laccesso a riferimenti null

Eccezioni controllate e non controllate In realtà queste categorie non sono perfette: non è colpa del programmatore se un utente inserisce un numero non corretto, ma leccezione NumberFormatException, lanciata da Integer.parseInt(String) è un eccezione non controllata Vedrete che la maggior parte delle eccezioni controllate accodono nella gestione dei dati in ingresso o in uscita, che è un fertile terreno per guasti esterni che non dipendono dal codice: Un file può essere stato rimosso o corretto La rete può essere disattivata Un server può essere non disponibile Ecc …

Eccezioni controllate Quando viene utilizzato un metodo che lancia una eccezione controllata, è necessario specificare cosa fare: Rimandare la gestione della eccezione al metodo chiamante Catturare leccezione e gestirla in locale Rimandare leccezione al chiamante – se stiamo implementando un metodo in cui viene lanciata una eccezione controllata (o che utilizza un metodo che lancia una eccezione controllata) e non siamo in grado di gestirla, tale eccezione viene passata direttamente al metodo chiamante. Questa operazione viene fatta post-ponendo alla dichiarazione del metodo che stiamo implementando la parola di codice throws

Rimandare leccezione al chiamante Es class noGasException extends Exception { } class Auto { // public void drive(double km) throws noGasException { double c= km/consumo; if (c > carburante) { carburante = 0; throw new noGasException (Not enough gas); } carburante=-c; } Ogni metodo che chiama drive() deve gestire leccezione di tipo noGasException

Rimandare leccezione al chiamante class Auto { public int checkGas() throws noGasException { if (carburante <=0 ) { throw new noGasException (Not more gas); } return carburante; } // public void drive(double km) throws noGasException { double c= km/consumo; if (checkGas()) { carburante = 0; } carburante=-c; } Il metodo checkGas lancia un eccezione noGasException e deve essere gestita in drive(): drive rimanda la gestione alla funzione che chiamerà drive()

Rimandare leccezione al chiamante Quando un metodo rimanda più eccezioni controllate, vanno elencate dopo throws separate con virgole: public void drive(double km) throws IOException, noGasException { … checkGas() <- lancia noGasException readFile() <- lancia IOException … }

Rimandare leccezione al chiamante Ovviamente se viene fatto un throws di un tipo di eccezione, tutte i tipi di eccezioni figli sono compresi: public void drive(double km) throws Exception { … checkGas() <- lancia noGasException readFile() <- lancia IOException … } Tutte le eccezioni Sono prese da throws Exception

Catturare le eccezioni Una eccezione prima o poi dovrà essere gestita. Normalmente accade che le eccezioni vengono lanciate in classi di basso livello e gestite nelle classi di alto livello, dove si ha una conoscenza dellambiente maggiore Per gestire una eccezione è necessario catturarla ed implementare il codice che deve essere eseguito una volta catturata. Se devono essere gestite due eccezioni, è necessario specificare il codice per ogni tipo di eccezione che viene catturata oppure catturare una eccezione padre di entrambe (ereditarietà).

Catturare le eccezioni Per catturare le eccezioni si usa il costrutto: try { linee di codice del programma } catch (eccezione_tipo1 E1) { linee di codice per la gestione delleccezione E1 } catch (eccezione_tipo2 E2) { linee di codice per la gestione delleccezione E2 } … Le istruzioni contenute nel blocco di codice delimitato da try { e } sono eseguite come normale linee di codice. Appena avviene in esse una eccezione (generata localmente o derivante da qualche funzione interna al try ), il controllo viene passato al ramo catch() relativo e vengono eseguite le istruzioni delimitate da { }

Catturare le eccezioni class Auto { public int drive(double km) throws noGasException { double c= km/consumo; if (carburante <= c ) { carburante = 0; throw new noGasException (No more gas); } carburante=-c; return carburante; } class Autodromo { public void run() { Auto Ferrari=new Auto(); try { Ferrari.drive(200); Ferrari.stop(); } catch (noGasException E) { System.err.println(E finita la benzina!!); } La clausola throws noGasException non è più necessaria, poiché leccezione è gestita localmente nel try - catch Se il metodo drive lancia un eccezione noGasException essa viene catturata dal catch

Informazioni sulle eccezioni La classe Exception di Java prevede una serie di funzioni utiliìssime in caso di debug. Ha la possibilità di memorizzare un messaggio in fase di lancio della eccezione (nel costruttore). printStackTrace() – stampa lo stack della CPU al momento della eccezione (lista di funzioni attualmente nello stack di sistema) getMessage() – stampa il messaggio memorizzato dentro leccezione. E consigliato gestire sempre in maniera esplicita le eccezioni, eventualmente stampando sullo stdout il messaggio e lo sack: non mettere a tacere le eccezioni per nessun motivo, poiché se si verifica un errore non ce ne accorgiamo

Catturare le eccezioni class Auto { public int drive(double km) throws noGasException { double c= km/consumo; if (carburante <= c ) { carburante = 0; throw new noGasException (Not more gas); } carburante=-c; return carburante; } class Autodromo { public void run() { Auto Ferrari=new Auto(); try { Ferrari.drive(200); Ferrari.stop(); } catch (noGasException E) { } Come sappiamo che è avvenuta una eccezione??

Catturare le eccezioni class Auto { public int drive(double km) throws noGasException { double c= km/consumo; if (carburante <= c ) { carburante = 0; throw new noGasException (Not more gas); } carburante=-c; return carburante; } class Autodromo { public void run() { Auto Ferrari=new Auto(); try { Ferrari.drive(200); Ferrari.stop(); } catch (noGasException E) { E.printStackTrace(); } Stampa lo stack della applicazione sullo stderr. Notare luso della variabile noGasException E e la chiamata ad un metodo ereditato da Exception

La clausola finally A volte si ha bisogno di eseguire comunque delle istruzioni prima di lasciare il comando al gestore delle eccezioni. Il costrutto finally { } permette di specificare una serie di istruzioni che devono essere eseguite comunque sia che non si verifichi nessuna eccezione, sia che si sia verificata una eccezione. Un esempio classico è la chiusura di un file: se abbiamo aperto un file e si verifica una eccezione (una delle tante che possono essere catturate), è necessario chiudere il file prima di gestire leccezione.

La clausola finally class Auto { public int drive(double km) throws noGasException { double c= km/consumo; if (carburante <= c ) { carburante = 0; throw new noGasException (Not more gas); } carburante=-c; return carburante; } class Autodromo { public void run() { Auto Ferrari=new Auto(); try { Ferrari.drive(200); Ferrari.stop(); } finally { System.out.println(Ferrari ciao!); } La stampa di Ferrari ciao!! viene sempre eseguita, sia che avvenga leccezione sia che non avvenga.

Note di cronaca Il 4 giugno 1996, il razzo Arianne sviluppato dallESA virò dalla sua rotta dopo circa 40 secondi dal lancio e dovette essere distrutto in volo per evitare pericoli La causa che innescò questo incidente fu un eccezione non gestita! Il missile conteneva due sensori (uno di riserva) che elaboravano dati e li trasformavano in informazioni riguardanti la posizione del missile. Uno dei sensori misurò una forza di accelerazione maggiore e tale valore espresso in virgola mobile doveva essere memorizzato in un intero a 16 bit. Il linguaggio ADA, utilizzato nei dispositivi, genera una eccezione nel caso di simili cast ma i programmatori avevano deciso che tale situazione non sarebbe mai accaduta e non avevano gestito leccezione

Note di cronaca Quando avvenne il trabocco, venne lanciata leccezione e poiché non cera il gestore, il sensore si spense. Il computer allora attivò il sensore di riserva, che lanciò la stessa eccezione e si spense anche lui. I progettisti non avevano previsto che due sensori si spegnessero insieme dato che le probabilità di un simile evento sono remotissime. A quel punto il razzo era privo delle informazioni sulla propria posizione e sulla rotta. … BUM !!