Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoDonato Pisano Modificato 9 anni fa
1
LIP: 22 Marzo 2005 Eccezioni
2
Eccezioni-Richiami Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
3
Le eccezioni in Java i tipi di eccezione sono particolari classi che –contengono solo il costruttore ci possono essere più costruttori overloaded le eccezioni sono oggetti –creati eseguendo new di un exception type e quindi eseguendo il relativo costruttore esiste una gerarchia “predefinita” di tipi relativi alle eccezioni –nuovi tipi di eccezioni sono collocati nella gerarchia con l’usuale extends
4
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
5
Esempio Definizione di una nuova eccezione checked public class NotFoundException extends Exception { //costruttore public NotFoundException(string s) {super(s);} } la stringa contenuta nell’eccezione permette all’utente di identificare la procedura che la ha sollevata può comparire nel messaggio di errore che si stampa subito prima di forzare la terminazione dell’esecuzione si puo’ anche mettere un costruttore senza argomenti
6
Lanciare eccezioni Una eccezione si lancia tramite il costrutto throw throw new NotFoundException(“nome metodo corrente”); Il metodo corrente si sospende e passa il controllo al chiamante
7
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), cattura e gestisce l’eccezione
8
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 In realta’ possono esserci vari statements catch per catturare diverse eccezioni e gestirle in modo specifico (vedi documentazione Java)
9
Esercizio: Eccezioni –NullPointerException e’ una eccezione unchecked primitiva – DuplicateException e’ una eccezione checked (la dovete definire) –NotFoundException e’ una eccezione checked (la dovete definire)
10
Esercizio Proposto Definire una classe Frame che definisce oggetti che rappresentano funzioni parziali (a dominio finito) da String (dominio) ad Integer (Codominio) In sostanza sono delle tabelle (senza duplicati) Vogliamo le seguenti operazioni (al solito espresse da costruttori e metodi pubblici) Simili alle operazioni usate dei Frames della semantica operazionale
11
Costruttori e Metodi d’Istanza \\costruttore public Frame(){ \\EFFECTS\\EFFECTS: costruisce un nuovo Frame indefinito per tutti i valori } \\ metodi osservatori public boolean defined(String s) throws NullPointerException{ \\EFFECTS\\EFFECTS: se s e’ null solleva NullPointerException, se this e’ definita per s restituisce true, altrimenti restituisce false} NullPointer (unchecked) si potrebbe anche non mettere nell’header (per completezza della specifica puo’ essere conventiente metterla)
12
Metodid’Istanza \\ metodi osservatori public Integer apply(String s) throws NullPointerException, NotFoundException{ \\EFFECTS\\EFFECTS: se s e’ null solleva NullPointerException, se this e’ definita per s restituisce il valore associato, altrimenti solleva NotFoundException} public String toString(){ \\EFFECTS\\EFFECTS: restituisce una stringa che contiene le coppie di this, (x,y) dove y e’ l’elemento associato ad x} \\ metodi modificatori public void bind(String s, Integer x) throws NullPointerException, DuplicateException{ \\MODIFIES\\MODIFIES: this \\EFFECTS\\EFFECTS: se s o x e’ null solleva NullPointerException, se this e’ definita per s solleva DuplicateException, altrimenti modifica this aggiungendo l’associazione tra s ed x}
13
Come si puo’ implementare Frame? La scelta fondamentale (come per tutte le classi che definiscono oggetti) e’ quella delle variabili d’istanza Definiscono lo stato degli oggetti Vanno dichiarate nella classe Inizializzate dal costruttore
14
Come si scelgono? Devono permettere di memorizzare le informazioni che gli oggetti hanno Devono anche permettere di implementare i costruttori e metodi d’istanza richiesti (in modo possibilmente efficiente) Come si puo’ rappresentare un Frame?
15
Per esempio Dobbiamo di fatto memorizzare l’insieme delle coppie (valore dominio-codominio) Simile all’esercizio dell’Elenco che abbiamo visto Si puo’ usare un array (un Vector?) che contiene coppie (String,Integer) (va definito un tipo coppia ausiliario-tipo Abbonato) Si possono usare due arrays (Vector?) che memorizzano uno il dominio e l’altro il codominio, mantenendo nella stessa posizione gli elementi associati
16
Variabili d’istanza private Vector dom; \\ dominio private Vector cod; \\ codominio Per ogni posizione i cod.elementsAt(i) e’ il valore del codominio associato al valore del dominio dom.elementsAt(i) Di conseguenza i due Vectors hanno sempre la stessa lunghezza
17
Sviluppare (in parallelo) un Tester Prende dei valori da console (o metterceli direttamente) Costruire un Frame vuoto Prende dei valori da console (o metterceli direttamente) ed inserire delle associazioni (usando bind) Testare sul Frame i metodi apply e defined Bisogna testare anche le eccezioni che questi metodi possono sollevare (bind e apply)
18
Cosa vuol dire? Provare apply su un valore che non e’ definito (il metodo deve sollevare l’eccezione NotFoundexception) Provare bind su un valore che e’ gia’ definito (il metodo deve sollevare l’eccezione Duplicateexception) Catturare le Eccezioni e non fare fallire il main (mediante try e catch) Fare invece stampare il motivo dell’eccezione (con toString)
20
Tester (con eccezioni)
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.