1 Astrazione procedurale ed Eccezioni. 2 Procedure stand alone 4 indipendenti da specifici oggetti 4 come si realizzano in Java –metodi statici definiti.

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

Java base V: La gestione delle Eccezioni
Universita di Camerino
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.
29 febbraio 2008 Progettare tipi di dato astratti.
LIP: 4 Aprile 2008 ECCEZIONI. Eccezioni Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
MultiSet, Liste Ordinate
Le gerarchie di tipi.
Esercitazione Frame. Argomento Realizzazione di un tipo di dato astratto Usare le eccezioni per segnalare situazioni particolari Invariante e funzione.
LIP: 19 Aprile Contenuto Soluzione Compitino Tipo di dato MultiSet, estensione con sottoclasse.
Metodologie di Programmazione = decomposizione basata su astrazioni
1 Le gerarchie di tipi: implementazioni multiple e principio di sostituzione.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti.
Liste Ordinate 3 Maggio Ultima Lezione Abbiamo visto i tipi di dato astratti IntList e StringList Realizzano liste di interi e di stringhe Realizzati.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Eccezioni Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – – SIENA Uff
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
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.
Approfondimento delle classi
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.
Le classi Definizione di classe Attributi e metodi di una classe Costruttori e distruttori Private e public Funzioni friend Il puntatore this.
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 Programmazione = decomposizione basata su astrazioni (con riferimento a Java)
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti dispense prof. G. Levi.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA FINALE DEL 21 MAGGIO 2007 NOME: COGNOME: ________________________________________________________________________________.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Le eccezioni F. Bombi 01/11/ Errori e situazioni impreviste situazioni eccezionali In un programma situazioni eccezionali possono.
Astrazione procedurale ed eccezioni
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Eccezioni Metodi parziali Eccezioni: Usi e Metodi parziali Eccezioni: rimuovere i requires Eccezioni: rimuovere i requires Eccezioni: definizione, sollevamento,
1 Eccezioni in Java. 2 Ricordiamo che 4 una procedura può terminare –normalmente, ritornando un risultato –in modo eccezionale ci possono essere diverse.
1 Astrazione sul controllo: gli iteratori. 2 Perché vogliamo iterarare “in modo astratto” 4 problema: iterare su tipi di dato arbitrari  esempio: procedura.
Liste di Interi Esercitazione. Una variante Liste concatenate di Integers Non modificabile Costruttori per creare la lista vuota o un nodo Metodi d’istanza.
1 Progettazione dettagliata di un Tipo di Dato Astratto: l’ambiente di metodi.
Ripasso su Java. Introduzione Per risolvere problemi complessi, i linguaggi di programmazione forniscono costrutti per realizzare nuove funzioni che trasformino.
Specifiche. Scopo e significato delle specifiche (1) Lo scopo di una specifica è di definire il comportamento di un ’ astrazione. Gli utenti si baseranno.
Liste Concatenate 11 Aprile E’ una delle strutture dati fondamentali in tutti i linguaggi di programmazione di alto livello Una Lista Concatenata.
1 Astrazione sul controllo: gli iteratori. 2 Gli iteratori 4 perché vogliamo iterarare “in modo astratto” 4 iteratori e generatori in Java –specifica.
1 Progettare un Tipo di Dato Astratto. 2 Scelte di Progetto (astrazione) 4 Caratteristiche degli oggetti –Modificabilità 4 Scelta delle operazioni –Realizzare.
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti.
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: 8 Marzo 2005 Vettori. Abbiamo visto L’uso di Vector come alternativa all’uso di arrays Rivediamo l’esercizio dell’altra volta.
Esercitazione del 7 marzo 2008 Ereditarieta’. Esercizio: soluzione Implementare la seguente specifica che definisce un tipo di dato Libro.
Ese 3 (del 3 Aprile 2003). Testo Progettare la specifica e l’implementazione del tipo di dato astratto modificabile Stack, supponendo che gli elementi.
Ese 3 (del 31 Marzo 2004). Testo Dare rappresentazione e realizzazione dei metodi della seguente classe QueueWithPriority. Nella risposta, non riportare.
LIP: 22 Marzo 2005 Eccezioni. Eccezioni-Richiami Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
1 Le s-espressioni. 2  Sexpr 4 alberi binari (possibilmente “vuoti”) che hanno sulle foglie atomi (stringhe) 4 sono la struttura dati base del linguaggio.
PolyFun. Dare implementazione,funzione di astrazione, invarianti della rappresentazione. Provare che i metodi apply e bind preservano gli invarianti.
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.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
Esercitazione. Problema Vogliamo definire in modo gerachico un tipo di dato che definisce Tabelle multi-dimensionali con un numero di righe variabili.
Progettare una classe 21 Febbraio La classe BankAccount Vogliamo realizzare una classe i cui oggetti sono dei semplici conti bancari. * Identifichiamo.
1 Metodologie di Programmazione = decomposizione basata su astrazioni.
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.
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
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 del 9 marzo 2007 Ereditarieta’. Richiami Definire sottoclassi (ereditarieta’) Overriding Specificatori di accesso (private, protected) Principio.
Liste Concatenate 28 Marzo Avviso Martedi’ 4 Aprile: Verifica di LIP Per iscriversi (obbligatorio) inviare un e- mail entro venerdi’ 31 Marzo a.
1 Un esempio con iteratore: le liste ordinate di interi.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
LIP: 15 Marzo 2005 Vettori di interi. Esercizio proposto Definire una classe VectorInt i cui oggetti sono vettori omogenei di interi ordinati in modo.
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.
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:

1 Astrazione procedurale ed Eccezioni

2 Procedure stand alone 4 indipendenti da specifici oggetti 4 come si realizzano in Java –metodi statici definiti dentro una classe che non ha variabili e metodi di istanza costruttore –può contenere variabili statiche condivise dalle varie attivazioni di metodi 4 una procedura è un mapping da un insieme di argomenti di ingresso ad un insieme di risultati –con possibile modifica di alcuni degli argomenti di ingresso solo se sono oggetti –possibili effetti laterali su variabili di classe visibili

3 Astrazione via specifica Vedremo come utilizzare l’astrazione tramite specifica 4 la specifica descrive le proprieta’ della procedura, astraendo dal modo in cui la procedura ottiene il risultato atteso, ovvero dall’implementazione 4 la specifica e’ l’interfaccia verso chi usa la procedura e contiene tutte e sole le informazioni necessarie a chi la usa 4 l’implementazione è in questo modo invisibile all’utente

4 Importanza della specifica 4 località –l’implementazione di una procedura può essere letta o scritta senza esaminare le implementazioni delle altre procedure utile durante lo sviluppo (anche da parte di più persone) e la manutenzione 4 modificabilità –una procedura può essere reimplementata senza richiedere modifiche alle astrazioni che la utilizzano utile durante la manutenzione per ridurre gli effetti indotti da una modifica

5 Come e’ fatta la specifica? 4 “scheletro” formato da 1. headers dei metodi pubblici 2. commenti informali (tipo quelli che abbiamo usato a LIP) che descrivono le proprieta’ dei metodi, ovvero la relazione tra gli inputs ed i risultati ( gli input sono i parametri ma anche quelli impliciti se ci sono modifiche esterne) 4 manca il codice del corpo dei metodi (implementazione) che può essere sviluppato in un momento successivo ed indipendentemente dallo sviluppo dei “moduli” che usano le procedure specificate

6 Un esempio di specifica public class Arrays { // OVERVIEW: La classe fornisce un insieme di // procedure utili per manipolare arrays di int public static int search (int[] a, int x) // EFFECTS: se x occorre in a, ritorna un // indice in cui occorre, altrimenti -1 public static int searchSorted (int[] a, int x) // REQUIRES: a è ordinata in modo crescente // EFFECTS: se x occorre in a, ritorna un // indice in cui occorre, altrimenti -1 public static void sort (int[] a) // MODIFIES: a // EFFECTS: riordina gli elementi di a in // modo crescente, per esempio // se a=[3,1,6,1] a_post=[1,1,3,6] }

7 La classe public class Arrays { // OVERVIEW: La classe fornisce un insieme di // procedure utili per manipolare arrays di int.... } 4 la classe compare nella specifica, perché i metodi dovranno essere reperiti usando il nome della classe  OVERVIEW: si usa per descrivere in modo informale il contenuto della classe

8 I metodi... public static int search (int[] a, int x)... public static int searchSorted (int[] a, int x)... public static void sort (int[] a)... 4 gli headers dei metodi (codice Java) sono la parte sintattica della specifica del metodo 4 specificano (in aggiunta alla visibilità) –nome del metodo –nomi e tipi dei parametri formali –tipo del risultato –search: int array * int -> int 4 dovrebbero anche elencare le eventuali eccezioni sollevate dalla procedura –ignorate per ora

9 Inoltre 4 I metodi sono anche corredati da commenti informali (tipo quelli usati a LIP) che descrivono la loro precondizione, postcondizione e le eventuali modifiche

10 I commenti: precondizioni... public static int search (int[] a, int x) // EFFECTS: se x occorre in a, ritorna un // indice in cui occorre, altrimenti -1 public static int searchSorted (int[] a, int x) // REQUIRES: a è ordinata in modo crescente // EFFECTS: se x occorre in a, ritorna un // indice in cui occorre, altrimenti la clausola REQUIRES descrive le precondizioni che devono essere verificate sui parametri di ingresso perché la procedura sia definita –possono esserci inputs impliciti (variabili visibili, files, etc.) 4 se la clausola REQUIRES non è presente, la procedura è totale (esempio, search) –è definita per tutti gli inputs corretti rispetto al tipo  altrimenti è parziale (esempio, searchSorted)

11 I commenti: MODIFIES... public static void sort (int[] a) // MODIFIES: a // EFFECTS: riordina gli elementi di a in // modo crescente, per esempio // se a=[3,1,6,1] a_post=[1,1,3,6]... 4 la clausola MODIFIES elenca tutti i parametri di ingresso che vengono modificati –compresi gli inputs impliciti (variabili visibili, files, etc.) 4 se esistono parametri di ingresso che vengono modificati –la procedura produce effetti laterali 4 Se MODIFIES non e’ presente allora vuol dire che non viene modificato niente

12 I commenti: postcondizioni... public static int searchSorted (int[] a, int x) // REQUIRES: a è ordinata in modo crescente // EFFECTS: se x occorre in a, ritorna un // indice in cui occorre, altrimenti -1 public static void sort (int[] a) // MODIFIES: a // EFFECTS: riordina gli elementi di a in // modo crescente, per esempio // se a=[3,1,6,1] a_post=[1,1,3,6]... 4 la clausola EFFECTS descrive le proprietà degli outputs e le modifiche effettuate su tutti gli inputs elencati nella clausola MODIFIES 4 assumendo che siano verificate le proprietà specificate in REQUIRES  a_post rappresenta il valore di a dopo il ritorno del metodo

13 Procedure Parziali... public static int searchSorted (int[] a, int x) // REQUIRES: a è ordinata in modo crescente // EFFECTS: se x occorre in a, ritorna un // indice in cui occorre, altrimenti La specifica dice che:  se searchSorted e’ chiamata con valori che soddisfano la precondizione (REQUIRES) allora valgono le proprieta’ specificate dalla postcondizione (EFFECTS)  non dice niente su cosa succede quando searchSorted e’ chiamata con un array non ordinato

14 Specifica ed implementazione 4 L’implementazione e’ data dal – codice dei corpi dei metodi 4 Puo’ essere sviluppata in un momento successivo ed indipendentemente dallo sviluppo dei moduli che usano le procedure specificate (questi moduli vedono solo la loro specifica) 4 La specifica potrebbe essere compilata a parte avendo inserito opportuni return, insieme ai moduli che la usano 4 Chiaramente l’implementazione dipende dalla specifica, nel senso che la deve soddisfare

15 Cosa vuol dire? 4 La procedura modifica solo gli inputs indicati nella clausola MODIFIES 4 Se la procedura è chiamata con parametri che soddisfano REQUIRES allora produce dei risulati che soddisfano EFFECTS 4 Se la spefica è parziale non ci sono vincoli su quello che può fare quando è chiamata con parametri che non soddisfano EFFECTS (run forever,……)

16 Esempi di implementazione 1 public class Arrays { // OVERVIEW: La classe fornisce un insieme di // procedure utili per manipolare arrays di int... public static int searchSorted (int[] a, int x) // REQUIRES: a è ordinata in modo crescente // EFFECTS: se x occorre in a, ritorna un // indice in cui occorre, altrimenti -1 // usa la ricerca lineare {if (a == null) return -1; for (int i = 0; i < a.length; i++) if (a[i] == x) return i; else if (a[i] > x) return -1;}... } 4 se la precondizione non è soddisfatta, l’implementazione non è corretta (si interrompe la ricerca..)  implementazione piu’ efficiente sfruttando la precondizione

17 Esempi di implementazione 1 public class Arrays { // OVERVIEW: La classe fornisce un insieme di // procedure utili per manipolare arrays di int... public static int searchSorted (int[] a, int x) // REQUIRES: a è ordinata in modo crescente // EFFECTS: se x occorre in a, ritorna un // indice in cui occorre, altrimenti -1 // usa la ricerca lineare {if (a == null) return -1; for (int i = 0; i < a.length; i++) if (a[i] == x) return i; else if (a[i] > x) return -1;}... } 4 la specifica comunque soddisfatta 4 E’ corretto ritornare -1 se a e’ null, l’elemento non occorre nell’array

18 Esempi di implementazione 2.1 public class Arrays { // OVERVIEW:... public static void sort (int[] a) // MODIFIES: a // EFFECTS: riordina gli elementi di a in modo // crescente, se a=[3,1,6,1] a_post=[1,1,3,6] // usa il QuickSort {if (a == null) return; quickSort(a, 0, a.length - 1);}... }  Inseriamo nella classe il metodo privato quickSort –Non fa parte della specifica (non e’ visibile fuori dalla classe) 4 per i metodi private e’ sufficiente l’implementazione –Diamo anche I commenti, utili per la correttezza 4 Avremmo potuto usare un qualsiasi altro algoritmo di ordinamento (questo resta invisibile a chi usa la procedura sort)

19 Procedure parziali o totali? 4 Le procedure parziali sono meno sicure –Quando chiamate con parametri che non soddisfano la clausola REQUIRES possono produrre errori di qualsiasi tipo (la specifica non ci fornisce informazioni) –Chi chiama una procedura parziale dovrebbe fornire parametri che soddisfano REQUIRES (ma come garantirlo senza sapere dove viene usata?) –D’altra parte le procedure parziali sono in genere più efficienti (vedi searchSorted)

20 4 non è verificata la precondizione –potrebbe succedere di tutto, dal ritorno di risultati privi di significato, alla non terminazione, al danneggiamento di dati permanenti public static int mcd (int n, int d) // REQUIRES: n, d > 0 // EFFECTS: ritorna il massimo comun divisore // di n e d 4 chiunque utilizzi la procedura deve preoccuparsi di verificare che i dati passati verifichino la precondizione –chi lo garantisce? 4 chi implementa la procedura può ignorare i casi non previsti Precondizione non soddisfatta

21 Quindi 4 Se la procedura parziale è usata in un contesto limitato allora è facile verificarne l’uso (vedi quickSort che puo’ essere chiamata solo nella classe Arrays) 4 Altrimenti, è conveniente modificare la specifica e l’implementazione in modo che la procedura segnali in modo esplicito l’errore, effettuando un controllo esplicito sui parametri di ingresso che ritorna un risultato particolare

22 Esempio public static int fact (int n) //REQUIRES: n>0 // EFFECTS: ritorna n! public static int fact (int n) // EFFECTS: se n>0, ritorna n!, altrimenti 0 4 La prima versione e’ parziale 4 La seconda e’ totale, usiamo un valore particolare 0 per segnalare una situazione particolare.

23 Altro Esempio public static int search (int[] a, int x) // EFFECTS: se x occorre in a, ritorna un // indice in cui occorre, altrimenti -1 4 La procedura e’ totale (si usa un valore particolare per segnalare un caso speciale) 4 il chiamante deve comunque trattare in modo speciale il valore che codifica la situazione particolare –chi lo garantisce?

24 4 le procedure parziali e la codifica di situazioni particolari portano a programmi poco robusti 4 un programma robusto si comporta in modo ragionevole anche in presenza di “errori” –per esempio, continua dopo il verificarsi dell’errore con un comportamento ben-definito che approssima quello normale –come minimo, termina con un messaggio di errore “informativo” senza danneggiare dati permanenti 4 cosa serve? –un meccanismo (o approccio) che trasferisca l’informazione al chiamante in tutte queste situazioni –distinguendo le varie situazioni –con una gestione delle situazioni “strane” separata dal flusso di controllo normale della procedura Robustezza

25 Il meccanismo delle eccezioni 4 una procedura può terminare –normalmente, ritornando un risultato –in modo eccezionale ci possono essere diverse terminazioni eccezionali in Java, corrispondono a diversi tipi di eccezioni il nome del tipo di eccezione viene scelto da chi specifica la procedura per fornire informazione sulla natura del problema 4 Esistono eccezioni predefinite 4 Ma si possono anche definire nuove eccezioni per segnalare situazioni particolari

26 Le eccezioni in Java 4 i tipi di eccezione sono particolari classi che –contengono solo il costruttore ci possono essere più costruttori overloaded –sono definite in “moduli” separati da quelli che contengono i metodi che le possono sollevare 4 le eccezioni sono oggetti –creati eseguendo new di un exception type e quindi eseguendo il relativo costruttore 4 esiste una gerarchia “predefinita” di tipi relativi alle eccezioni –nuovi tipi di eccezioni sono collocati nella gerarchia con l’usuale extends

27 La gerarchia di tipi per le eccezioni Throwable Exception Error RuntimeException  se un nuovo tipo di eccezione estende la classe Exception –l’eccezione è checked  se un nuovo tipo di eccezione estende la classe RuntimeException –l’eccezione è unchecked

28 Differenza: checked e unchecked 4 se una procedura può sollevare una eccezione checked –deve elencarla nel suo header (tramite throws) altrimenti si verifica un errore a tempo di compilazione 4 se una procedura può sollevare una eccezione unchecked –può non elencarla nel suo header

29 Sintassi della clausola throws ( ) throws,..., { }  La clausola throws viene inserita nella dichiarazione del metodo per informare il compilatore che durante l'esecuzione di quel metodo possono essere generate eccezioni dei tipi elencati dopo la parola chiave throws, la cui gestione viene delegata al chiamante. 4 Notate che in questo modo le eccezioni fanno anche parte della specifica (chi usa la procedura deve esserne informato!) 4 Quelle checked devono essere obbligatoriamente riportate nell’header 4 Suggerimento: elencare anche quelle unchecked in modo da renderle parte della specifica

30 Eccezioni Primitive –IndexOutOfBoundsException –NullPointerException E’ una eccezione unchecked, indica l’accesso ad un posizione inesistente di un array E’ una eccezione unchecked, indica l’accesso ad un oggetto indefinito

31 Definire tipi di eccezione public class NuovoTipoDiEcc extends Exception { public NuovoTipoDiEcc(string s) {super(s);} } 4 è checked 4 definisce solo un costruttore –come sempre invocato quando si crea una istanza con la new –il costruttore può avere parametri 4 il corpo del costruttore riutilizza semplicemente il costruttore del supertipo –perché deve passargli il parametro 4 una new di questa classe provoca la creazione di un nuovo oggetto che “contiene” la stringa passata come parametro

32 Costruire oggetti eccezione public class NuovoTipoDiEcc extends Exception { public NuovoTipoDiEcc(string s) {super(s);} } 4 una new di questa classe provoca la creazione di un nuovo oggetto che “contiene” la stringa passata come parametro Exception e = new NuovoTipoDiEcc (“Questa è la ragione”) ; String s = e.toString() ;  la variabile s punta alla stringa “NuovoTipoDiEcc: Questa è la ragione”

33 Lanciare eccezioni 4 una procedura può terminare –(ritorno normale) con un return –(ritorno di una eccezione) con un throw public static int fact (int n) throws NonpositiveExc // EFFECTS: se n>0, ritorna n! // altrimenti solleva NonpositiveExc { if (n <= 0) throw new NonPositiveExc(“Num.fact”);...} 4 la stringa contenuta nell’eccezione 4 permette all’utente di identificare la procedura che la ha sollevata 4 può comparire nel messaggio di errore che si stampa subito prima di forzare la terminazione dell’esecuzione 4 Notate che il comportamento eccezionale va incluso nella specifica

34 Gestione delle Eccezioni 4 Cosa succede quando un metodo termina sollevando un’eccezione? 4 L’eccezione viene passata al metodo chiamante 4 Per default, un metodo che riceve un'eccezione termina a sua volta l'esecuzione e passa l'eccezione al metodo chiamante.  Quando l'eccezione raggiunge main, l'esecuzione del programma termina stampando un opportuno messaggio di errore.

35 Esempio:riferimento null public class NestedNullPointer { public static void bar(){ Object o = null; System.out.println(o.toString()); } public static void foo(){ bar(); } public static void main(String [] args){ foo(); }

36 Esecuzione del main  java NestedNullPointerException  in thread "main" java.lang.NullPointerException at NestedNullPointer.bar(NestedNullPointer.java:4) at NestedNullPointer.foo(NestedNullPointer.java:7) at NestedNullPointer.main(NestedNullPointer.java:10) 4 Tutti i metodi annidati terminano  Viene elencata la catena dei metodi attivi nel momento in cui si verifica l'eccezione ( bar - foo - main ) e per ogni metodo la linea di codice dove si è verificata.

37 Esempio:Outof Bounds public class OutOfBounds { public static void main(String [] args){ int [] array = new int [5]; for (int i = 0; i < array.length; i++) { array[i] = (int) (100 * Math.random()); } System.out.println("Contenuto dell'array:"); // Errore nella guardia del for for (int i = 0; i <= array.length; i++) { System.out.println(array[i]); }

38 Alternativa: Gestione Esplicita Il chiamante puo’ –gestione di default, mediante propagazione dell’eccezione alla procedura chiamante possibile solo per eccezioni non checked o per eccezioni checked elencate nell’header della procedura che riceve l’eccezione –gestione esplicita (mediante try and catch) –Puo’ catturare e gestire l’eccezione in generale, quando si ritiene di poter recuperare uno stato consistente e di portare a termine una esecuzione quasi “normale”

39 Catturare una Eccezione  Il codice che potrebbe sollevare l’eccezione e’ racchiuso all’interno di uno statement try  Il codice per gestire l’eccezione e’ racchiuso all’interno di uno statement catch

40 Sintassi: forma semplificata try { ; // possono lanciare delle eccezioni } catch( e1) { ; // catturiamo l'eccezione e1 di tipo ; // gestiamo e1 }

41 Semantica Si eseguono le. Se l'esecuzione termina senza fallimenti si prosegue ad eseguire la prima istruzione successiva al blocco try-catch. Altrimenti, se l'esecuzione di lancia un'eccezione except che e’ sottotipo di si eseguono le. Infine si prosegue ad eseguire la prima istruzione successiva al blocco try-catch. Altrimenti, se l’eccezione non e’ sottotipo di il metodo si comporta come se non ci fosse try-catch (l’eccezione viene passata al metodo chiamante

42 Esempio: termina normalmente public class CatchOutOfBounds { public static void main(String [] args) { int [] array = new int [5]; try { int i = 0; while (true) // ciclo infinito // ben presto i oltrepassera' il limite dell'array System.out.println(array[i++]); } catch (ArrayIndexOutOfBoundsException e) { System.out.println(”Finito"); } L’eccezione e’ catturata il metodo termina normalmente Pessimo modo di fare un ciclo su un array

43 Gestione esplicita delle eccezioni  codice per gestire l’eccezione NonPositiveExc eventualmente sollevata da una chiamata di fact try { x = Num.fact (y); } catch (NonPositiveExc e) { // qui possiamo usare e, cioè l’oggetto eccezione String s = e.toString() ; System.out.println(s) }  Nel catch e’ contenuto il codice per gestire l’eccezione 4 Il programma termina normalmente scrivendo il contenuto dell’eccezione (una spiegazione di cosa e’ successo)

44 Gestione esplicita delle eccezioni  la clausola catch non deve necessariamente identificare il tipo preciso dell’eccezione, ma basta un suo supertipo, principio di sostituzione try { x = Arrays.searchSorted (v, y); } catch (Exception e) { s.Println(e); return;} // s è una PrintWriter  segnala l’informazione sia su NullPointerExc che su NotFoundExc, eccezioni sollevate da searchsorted (vedi dopo)

45 Try e Catch annidati try {...; try { x = Arrays.searchSorted (v, y); } catch (NullPointerExc e) { throw new NotFoundExc ();} } catch (NotFoundExc b ) {...}  la clausola catch nel try più esterno cattura l’eccezione NotFoundExc se è sollevata da searchSorted o dalla clausola catch più interna  l’eccezione NullPointerExc non è visibile da fuori

46 Eccezioni e specifica 4 le eccezioni giocano un ruolo molto importante nell’astrazione via specifica –la specifica del comportamento deve riguardare anche le terminazioni eccezionali e descrivere esattamente cosa succede quando una procedura solleva una eccezione –Il chiamante della procedura deve essere informato tramite la specifica del significato delle eccezioni sollevate in modo da poterle eventualmente gestire

47 public static int searchSorted (int[] a, int x) throws NullPointerExc // REQUIRES: a è ordinata in modo crescente // EFFECTS: se x occorre in a, ritorna un // indice in cui occorre, altrimenti -1 { for (int i = 0; i < a.length; i++) if (a[i] == x) return i; else if (a[i] > x) return -1;}... } 4 Abbiamo tolto il controllo se a e’ null (ritornava -1)  quindi viene sollevata l’eccezione NullPointerExc (unchecked) 4 Non soddisfa la specifica, la procedura puo’ terminare senza soddisfare la postcondizione (che non prevede l’eccezione) Dimenticare una eccezione

48 Ruolo delle eccezioni 4 le eccezioni non sono necessariamente errori –ma metodi per richiamare l’attenzione del chiamante su situazioni particolari (classificate dal progettista come eccezionali) 4 possono essere utilizzate per ridurre al minimo i vincoli della clausola REQUIRES nella specifica, ovvero per segnalare le condizioni sui parametri (parziali vs totale) 4 la precondizione dovrebbe restare solo se la condizione è troppo complessa da verificare (vedi searchSorted) il contesto d’uso limitato del metodo (private) ci permette di convincerci che tutte le chiamate della procedura la soddisfano

49 Modifica del Fattoriale 4 La clausola EFFECTS descrive il comportamento della procedura includendo tutti i casi anche quelli per cui viene sollevata l’eccezione (quelli negativi) –La procedura fact è totale (non abbiamo vincoli in REQUIRES) –Soluzione migliore di quella in cui ritornavamo un valore particolare, chi la usa deve gestire la situazione particolare segnalata dall’eccezione public static int fact (int n) throws NonpositiveExc // EFFECTS: se n>0, ritorna n! // altrimenti solleva NonpositiveExc

50 Eccezioni nella specifica public static int searchSorted (int[] a, int x) throws NullPointerExc, NotFoundExc // REQUIRES: a è ordinato in modo crescente // EFFECTS: se a è null solleva NullPointerExc // se x non occorre in a solleva NotFoundexc // altrimenti ritorna un indice in cui occorre 4 le procedure possono continuare ad essere parziali –Verificare la precondizione e sollevare un’eccezione ridurrebbe in modo inaccettabile l’efficienza di searchSorted –Le eccezioni sono comunque utili per segnalare altre situazioni (tipicamente per controllare che i parametri non siano null)

51 Defensive programming 4 l’uso delle eccezioni facilita uno stile di progettazione e programmazione che protegge rispetto agli errori – anche se non sempre un’eccezione segnala un errore 4 fornisce una metodologia che permette di riportare situazioni di errore in modo ordinato –senza disperdere tale compito nel codice che implementa l’algoritmo 4 nella programmazione defensive, si incoraggia il programmatore a verificare l’assenza di errori ogniqualvolta ciò sia possibile –ed a riportarli usando il meccanismo delle eccezioni –un caso importante legato alle procedure parziali

52 Quando una procedura non soddisfa la sua precondizione 4 con le eccezioni le procedure tendono a diventare totali –ma non è sempre possibile 4 chi chiama la procedura dovrebbe farsi carico di effettuare tale controllo –sollevando una eccezione unchecked non elencata nell’header e non considerata negli EFFECTS, perché si riferisce ad un caso che non soddisfa REQUIRES questa eccezione può essere catturata, magari ad un livello superiore –si suggerisce di usare in questi casi una eccezione generica unchecked FailureException