Eccezioni in Java 1 Ricordiamo che 4 una

  • Slides: 27
Download presentation
Eccezioni in Java 1

Eccezioni in Java 1

Ricordiamo che 4 una procedura può terminare – normalmente, ritornando un risultato – in

Ricordiamo che 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 fornisce informazione sulla natura del problema 4 Esistono eccezioni predefinite 4 Ma si possono anche definire nuove eccezioni per segnalare situazioni particolari 2

Vedremo 4 Come si lanciano eccezioni 4 Come si gestiscono le eccezioni (Un programma

Vedremo 4 Come si lanciano eccezioni 4 Come si gestiscono le eccezioni (Un programma ben scritto dovrebbe prevedere tali eventualità inserendo delle istruzioni per individuare le anomalie e ripristinare una situazione corretta) 4 Vedremo poi in MP il ruolo e l’utilita’ delle eccezioni (che non indicano solo e necessariamente errori) 3

Le eccezioni in Java 4 i tipi di eccezione sono particolari classi che –

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 4

La gerarchia di tipi per le eccezioni Throwable Error Exception Runtime. Exception 4 se

La gerarchia di tipi per le eccezioni Throwable Error Exception Runtime. Exception 4 se un tipo di eccezione estende la classe Exception – l’eccezione è checked 4 se un tipo di eccezione estende la classe Runtime. Exception – l’eccezione è unchecked 5

Eccezioni Primitive – Index. Out. Of. Bounds. Exception E’ una eccezione unchecked, indica l’accesso

Eccezioni Primitive – Index. Out. Of. Bounds. Exception E’ una eccezione unchecked, indica l’accesso ad un elemento inesistente di un array – Null. Pointer. Exception E’ una eccezione unchecked, indica l’accesso ad un oggetto indefinito 6

Altri Errori 4 Errori di Cast 4 Tentativi di accedere a file inesistenti; 4

Altri Errori 4 Errori di Cast 4 Tentativi di accedere a file inesistenti; 4 Fine inaspettata di un file durante la lettura; 4 Errore hardware accedendo a un disco; 4 Chiusura inattesa di una connessione remota. . . 7

Differenza checked e unchecked 4 se una procedura può sollevare una eccezione checked –

Differenza checked e unchecked 4 se una procedura può sollevare una eccezione checked – deve elencarla nel suo header • altrimenti si verifica un errore a tempo di compilazione 4 se una procedura può sollevare una eccezione unchecked – può non elencarla nel suo header • Si puo’ comunque elencarla sempre per chiarezza 8

Sintassi della clausola throws <modificatori> <tipo> <nome-metodo> (<listaparametri>) throws <Classe-ecc 1>, . . .

Sintassi della clausola throws <modificatori> <tipo> <nome-metodo> (<listaparametri>) throws <Classe-ecc 1>, . . . , <Classe-ecc. N> { <corpo-metodo> } 4 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 Quelle checked devono essere obbligatoriamente riportate nell’header 9

Gestione delle Eccezioni 4 Cosa succede quando un metodo termina sollevando un’eccezione? 4 L’eccezione

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 l'esecuzione e passa l'eccezione al metodo chiamante. 4 Quando l'eccezione raggiunge main, l'esecuzione del programma termina stampando un opportuno messaggio di errore. 10

Esempio: riferimento null public class Nested. Null. Pointer { public static void bar(){ Object

Esempio: riferimento null public class Nested. Null. Pointer { public static void bar(){ Object o = null; System. out. println(o. to. String()); } public static void foo(){ bar(); } public static void main(String [] args){ foo(); } } 11

Esecuzione Ø Ø java Nested. Null. Pointer. Exception in thread "main" java. lang. Null.

Esecuzione Ø Ø java Nested. Null. Pointer. Exception in thread "main" java. lang. Null. Pointer. Exception at Nested. Null. Pointer. bar(Nested. Null. Pointer. java: 4) at Nested. Null. Pointer. foo(Nested. Null. Pointer. java: 7) at Nested. Null. Pointer. main(Nested. Null. Pointer. java: 10) 4 Tutti i metodi annidati terminano 4 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. 12

Esempio: Outof Bounds public class Out. Of. Bounds { public static void main(String []

Esempio: Outof Bounds public class Out. Of. Bounds { 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 (int i = 0; i <= array. length; i++) { System. out. println(array[i]); } } } 13

Alternativa: Gestione Esplicita Il chiamante puo’ – gestione di default, mediante propagazione dell’eccezione alla

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) • in generale, quando si ritiene di poter recuperare uno stato consistente e di portare a termine una esecuzione quasi “normale” 14

Catturare una Eccezione 4 Il codice che potrebbe sollevare l’eccezione e’ racchiuso all’interno di

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

Sintassi: forma semplificata try { <istruzioni-try>; // possono lanciare delle eccezioni } catch(<sottoclasse-Throwable> e

Sintassi: forma semplificata try { <istruzioni-try>; // possono lanciare delle eccezioni } catch(<sottoclasse-Throwable> e 1) {; // catturiamo l'eccezione e 1 di tipo <sottoclasse-Throwable> <istruzioni-catch>; // gestiamo e 1 } 16

Semantica Si eseguono le <istruzioni-try>. • Se l'esecuzione termina senza fallimenti si prosegue ad

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

Esempio: termina normalmente public class Catch. Out. Of. Bounds { public static void main(String

Esempio: termina normalmente public class Catch. Out. Of. Bounds { 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: "); try { int i = 0; while (true) // ciclo infinito // ben presto i oltrepassera' il limite dell'array System. out. println(array[i++]); } // catch (Throwable e) { catch (Array. Index. Out. Of. Bounds. Exception e) { System. out. println("Stampa terminata. . . "); } } } 18

Esempio 4 Supponiamo di avere in una classe Num una procedura statica con la

Esempio 4 Supponiamo di avere in una classe Num una procedura statica con la seguente specifica public static int fact (int n) throws Nonpositive. Exc // EFFECTS: se n>0, ritorna n! // altrimenti solleva Nonpositive. Exc 4 L’eccezione viene utilizzata per indicare un risultato particolare (invece di fornire un risultato particolare) 19

Esempio try { x = Num. fact (y); } catch (Non. Positive. Exc e)

Esempio try { x = Num. fact (y); } catch (Non. Positive. Exc e) { // qui possiamo usare e, cioè l’oggetto eccezione String s = e. to. String() ; System. out. println(s) } 4 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) 20

Esempio sugli arrays public static int search (int[] a, int x) throws Null. Pointer.

Esempio sugli arrays public static int search (int[] a, int x) throws Null. Pointer. Exc, Not. Found. Exc // EFFECTS: se a è null solleva Null. Pointer. Exc // se x non occorre in a solleva Not. Foundexc // altrimenti ritorna un indice in cui occorre 4 Una procedura stand-alone di una classe Arrays, usa eccezioni diverse per segnalare situazioni particolari 21

Un metodo che la usa 4 la clausola catch non deve necessariamente identificare il

Un metodo che la usa 4 la clausola catch non deve necessariamente identificare il tipo preciso dell’eccezione, ma basta un suo supertipo, principio di sostituzione try { x = Arrays. search (v, y); } catch (Exception e) { s. Println(e); return; } // s è una Print. Writer 4 segnala l’informazione sia su Null. Pointer. Exc che su Not. Found. Exc, eccezioni sollevate da searchsorted 22

Try e Catch annidati try {. . . ; try { x = Arrays.

Try e Catch annidati try {. . . ; try { x = Arrays. search (v, y); } catch (Null. Pointer. Exc e) { throw new Not. Found. Exc (); } } catch (Not. Found. Exc b ) {. . . } 4 la clausola catch nel try più esterno cattura l’eccezione se è sollevata da search. Sorted o dalla clausola catch più interna 4 l’eccezione Null. Pointer. Exc non è visibile da fuori Not. Found. Exc 23

Definire nuovi tipi di eccezione public class Nuovo. Tipo. Di. Ecc extends Exception {

Definire nuovi tipi di eccezione public class Nuovo. Tipo. Di. Ecc extends Exception { public Nuovo. Tipo. Di. Ecc(String s) {super(s); } } 4 è checked (analogo per unchecked) 4 definisce solo un costruttore 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 24

Costruire oggetti eccezione 4 una new di questa classe provoca la creazione di un

Costruire oggetti eccezione 4 una new di questa classe provoca la creazione di un nuovo oggetto che “contiene” la stringa passata come parametro Exception e = new Nuovo. Tipo. Di. Ecc (“Questa è la String s = e. to. String() ; ragione”) ; 4 la variabile s punta alla stringa “Nuovo. Tipo. Di. Ecc: Questa è la ragione” 25

Lanciare una eccezione: throw 4 una procedura può terminare – (ritorno normale) con un

Lanciare una eccezione: throw 4 una procedura può terminare – (ritorno normale) con un return – (ritorno di una eccezione) con un throw public static int fact (int n) throws Nonpositive. Exc // EFFECTS: se n>0, ritorna n! // altrimenti solleva Nonpositive. Exc { if (n <= 0) throw new Non. Positive. Exc(“Num. fact”); . . . } 4 la stringa contenuta nell’eccezione è utile soprattutto quando il programma non è in grado di “gestire” l’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 26

Nel Corso di Metodologie 4 Vedremo il ruolo delle Eccezioni (checked e unchecked) 4

Nel Corso di Metodologie 4 Vedremo il ruolo delle Eccezioni (checked e unchecked) 4 Esercizio: per imparare a gestirlo 4 Tabelle (Frames) con le Eccezioni 4 Main che le gestisce…… 27