Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Gestione delle eccezioni in Java: un approccio pratico, Appunti di Programmazione Java

sddddddddddddddddddddddddddddddddddddddddddddddddddddddd

Tipologia: Appunti

2018/2019

Caricato il 29/08/2019

francesco-pistorio
francesco-pistorio 🇮🇹

4.8

(8)

17 documenti

1 / 31

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
1
eccezioni
2018-2019
2
il problema della gestione degli errori
durante l’esecuzione, le applicazioni possono incorrere in errori più o meno gravi
causate da istruzioni critiche
I programmi possono fallire x vari motivi: input errati, errori logici, operazioni
matematiche come radice di num negativo o divisione x zero….
quando si invoca il metodo di un oggetto possono sorgere problemi su:
stato interno: valori incoerenti delle variabili
errori causati negli oggetti e nei dati manipolati, es indirizzi di rete, file,..
violazione del contratto di base,
es. tentativo di leggere da un flusso di dati terminato
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f

Anteprima parziale del testo

Scarica Gestione delle eccezioni in Java: un approccio pratico e più Appunti in PDF di Programmazione Java solo su Docsity!

1

eccezioni

il problema della gestione degli errori

● durante l’esecuzione, le applicazioni possono incorrere in errori più o meno gravi causate da istruzioni “critiche” ● I programmi possono fallire x vari motivi: input errati, errori logici, operazioni matematiche come radice di num negativo o divisione x zero…. ● quando si invoca il metodo di un oggetto possono sorgere problemi su:

  • stato interno : valori incoerenti delle variabili
  • errori causati negli oggetti e nei dati manipolati , es indirizzi di rete, file,..
  • violazione del contratto di base , ● es. tentativo di leggere da un flusso di dati terminato

3

il problema della gestione degli errori

● l’approccio classico di inserire nel codice di un programma controlli if-else per intercettare tutte le condizioni critiche è inadeguato ● controllare puntualmente per ogni istruzione tutte le condizioni di errore possibili renderebbe il codice illeggibile

– confonde il flusso di base del codice con i diversi

controlli di errore

● inoltre, non è facile prevedere tutte le situazioni di errore

● occorre garantire correttezza senza compromettere la

chiarezza

il problema della gestione degli errori

● Nella soluzione classica ● Il metodo che prevede di rilevare un errore restituisce al metodo chiamante un valore che indica fallimento o successo 2 problemi: ● il metodo chiamante può

  • ”dimenticarsi” di controllare il valore ricevuto à rischia di elaborare informazioni errate
  • Non essere in grado di far nulla in caso di fallimento à anch’esso deve delegare la soluzione del fallimento al suo chiamante, magari segnalando l’errore a suo modo

● Le eccezioni non devono poter essere trascurate;

● Le eccezioni devono poter essere gestite da un gestore

competente, non dal chiamante del metodo che fallisce

7

2 aspetti di fault handling

Reporting : individuazione della condizione d’errore

  • nel corso della normale esecuzione del codice di un metodo (o costruttore) ● Recovery : ripristino di una situazione corretta
  • logica indipendente che può seguire strategie alternative anche basate su informazioni aggiuntive In genere ● Il punto in cui viene individuato l’errore è scorrelato dal punto in cui si ripristina la situazione corretta ● In java la gestione delle eccezioni fornisce un meccanismo flessibile per trasferire il controllo dal punto in cui accade il fault al gestore competente che può ripristinare una situazione corretta

Sollevare una eccezione e gestirla

● Quando si individua una condizione di errore occorre sollevare/lanciare/ throw un “oggetto appropriato di tipo eccezione” ● Java offre una gerarchia di classi di eccezioni tra cui è possibile scegliere quella adeguata

  • usandola così com’è
  • o eventualmente derivandone una più specifica

● Una eccezione in Java è rappresentata da un oggetto della

gerarchia di classi che ha come base la classe Throwable

● Quando si lancia una eccezione il metodo interrompe la sua

esecuzione (come se eseguisse return) e passa

all’esecuzione dell’ exception handler [vedi oltre]

9

gestione delle eccezioni in sintesi

throwing: una eccezione viene sollevata/lanciata quando si incontra una condizione di errorecatching l’eccezione può essere intercettata da una clausola che racchiude l’istruzione che ha sollevato l’eccezione,

  • allo stesso livello o a uno più alto sullo stack delle invocazioni dei metodi [rilancio]
  • exception handler codice che gestisce le eccezioniLe eccezioni possono essere
  • Lanciate da una riga di codice.
  • Rilanciate più volte dai moduli che non sono in grado di gestirle

il meccanismo di gestione delle eccezioni in java

clausola try-catch

● anziché tentare di prevedere puntualmente le condizioni di errore che possono nascere dall’esecuzione di ogni singola istruzione, si racchiudono le operazioni in un blocco controllato dalla clausola try-catch

  • se nell’esecuzione di un’operazione di questo blocco viene lanciata/throw un’eccezione
  • può venire catturata da un apposito blocco catch ● Che può gestirla nel modo appropriato try { } catch (Exception e) { // come è gestita l’eccezione e} blocco controllato può sollevare Exception e eccezione: evento anomalo e occasionale, che richiede un comportamento aggiuntivo per essere gestito e exceptionxception handrer handrer

13

La classe Throwable

● una eccezione è un oggetto della classe Throwable o di una sua sottoclasse ● Costruttori:

  • Throwable()
  • Throwable(String message) ● Metodi principali:
  • getMessage() restituisce il messaggio associato all’eccezione
  • printStackTrace(Stream s) restituisce una “fotografia” dello stack di esecuzione al momento in cui si è verificata l'eccezione ● la stampa è sullo stream object PrintWriter o PrintStream
  • printStackTrace() restituisce una “fotografia” dello stack di esecuzione su stderr utile per diagnosticare l'eccezione senza terminare il programma

eccezioni sincrone e asincrone

l’eccezione sincrona viene sollevata come diretta conseguenza dell’esecuzione di una particolare istruzione

  • una istruzione throw lancia esplicitamente un’eccezione sincrona ● sintassi: throw <espressione che restituisce un oggetto Exception >
  • una istruzione può causare un errore runtime , logico o altro, ● in tal caso l’istruzione viene troncata(*) ● l’eccezione asincrona può essere sollevata in qualsiasi momento senza tener conto della particolare istruzione eseguita in quel momento
  • errore interno della jvm ● asincrona perché causata dall’esecuzione di istruzioni della macchina virtuale e non dal programma vero e proprio ● in questo caso generalmente non si può far niente (non si può catturare) (*) (^) Nota: se è un’espressione e l’eccezione è sollevata nell’operando sinistro, il destro non viene valutato

Exception

Error

15

la classe Throwable

● Un oggetto di tipo Throwable è una eccezione o un errore;

  • Error – indica i problemi relativi al funzionamento della jvm e va solitamente considerato irrecuperabile ● dunque non è da catturare e gestire ● es. LinkageError, ThreadDeath, VirtualMachineError
  • Exception – indica situazioni critiche recuperabili ● dunque può essere catturata e gestita ● es. errori in input, accesso oltre fine file, indice oltre range di un array ● in java ci sono molti tipi di eccezione predefinite ● è possibile definire eccezioni estendendo Throwable ma più spesso Exception
  • per fronteggiare l’esigenza di fornire informazioni specifiche note al programmatore ed utili per il trattamento delle eccezioni stesse

la classe Error : ciò che non si può gestire da programma

● Error tramite le sottoclassi definisce un range di errori che indica fallimento

  • nella stessa virtual machine - VirtualMachineError,
  • nel tentativo della VM di eseguire l’applicazione – LinkageError definiti non controllabili perché non può occuparsene l’applicazione … ● Gli Errori:
  • non possono essere gestiti col sistema dei try-catch
  • Causano sempre l’ Arresto della Virtual Machine
  • Non vengono mai dichiarati nel codice col throws o il throw , ma quando si verificano provocano la stampa nello stream degli errori di una traccia simile a quella delle eccezioni
  • sono rari ● Errori in Java
  • OutOfMemoryError : la Virtual Machine non dispone più di memoria
  • StackOverflowError : una procedura sta usando un meccanismo di ricorsione troppo in profondità e la Virtual Machine ha superato la memoria disponibile nello stack delle chiamate.
  • VirtualMachineError : un errore grave si `e verificato a livello della VM

19

Il Meccanismo delle Eccezioni

Il Meccanismo delle Eccezioni in Java

Una eccezione può essere: 1) generata da un metodo

  • esplicitamente tramite il costrutto ● throw ● es. throw new IllegalArgumentException(“bla bla”);
  • automaticamente da sistema runtime di java 2) catturata e gestita all’interno di un metodo
  • In un blocco catch di un costrutto try/catch 3) propagata verso il metodo chiamante che può catturare e gestire l’eccezione o continuare la propagazione (rilanciare l’eccezione)
  • tramite la dichiarazione di propagazione nella definizione del metodo ● throws

21

sintassi try/catch

Cattura e gestione delle eccezioni

  • il costrutto try / catch è costituito da un blocco try e da uno o più blocchi catch ● Il blocco try contiene il codice che può generare una o più tipi di eccezione ● Sono possibili più blocchi catch ( Ei ei ) , ciascuno cattura e gestisce le eccezioni della classe Ei o sottoclassi di questa - Exception Handler - all’interno del blocco ci si può riferire alla eccezione mediante ei try { } catch (Exception e) { // come è gestita} Cattura e gestione: sintassi del costrutto try/catch blocco controllato Eccezione e

Codice che cattura una eccezione

try { //Codice che può causare eccezioni float a=1,b=2,c=−1; float[] res=new float [2]; /*questo metodo può lanciare/throw una Exception∗/ solveSecondOrderEquation (a,b,c, res ); } catch (Exception ex){ //Gestione dell ’ Eccezione /exception handler System.out.println(”Errore nell ’Equazione:” + ex); } ● La parola chiave try racchiude un blocco di codice potenzialmente pericoloso perchè in grado di lanciare una eccezione. ● La parola chiave catch racchiude un blocco di codice che deve essere eseguito quando l’eccezione si verifica:

  • se non si verifica un’eccezione il codice del catch non viene eseguito nota: qui il blocco catch cattura qualunque catchable exception visto che è parametrizzata da un oggetto della classe Exception

25

Le eccezioni possono essere sollevate e ri-lanciate

throw e throws

● Rilancio di una Eccezione public void solveSecondOrderEquation(float a, float b, float c, float[] res) throws Exception{ if ( res.length !=2){ throw new Exception (” Errore in res ”); } if (a==0) { throw new Exception (”a e’ 0 ”); } float delta=b∗b−a∗ 4 ∗c; if ( delta <0) { throw new Exception(”il delta e’ <0”); } //TODO: codice che risolve l’equazione ● La parola chiave throws serve per indicare che un metodo può (ri)lanciare una Exception.

  • Se nel metodo esiste la dichiarazione throws per una data eccezione, il metodo non è costretto a gestire l’eccezione. ● Quando sono sollevate le eccezioni il codice viene interrotto, e si va alla ricerca di un punto del codice che sia in grado di Gestire l’Eccezione, risalendo eventualemente a ritroso (rilanciando tramite throws) ai metodi invocanti rilancio lancio lanciolancio 26 An IllegalAccessException is a checked Exception thrown when an application tries to create an instance (other than an array), set or get a field, or invoke a method, but the currently executing method does not have access to the definition of the specified class, field, method or constructor.

27

estendere Exception

● A volte per descrivere una condizione eccezionale è utile disporre di più dati di quelli nella classe Exception.

  • In questi casi, si può estendere Exception per creare una classe che contiene i dati aggiunti (solitamente assegnati nel costruttore). public class NoSuchAttributeException extends Exception { public final String attrName; public NoSuchAttributeException(String name) { super("No attribute named "" + name + "" found"); attrName = name; } } checked Exception ● Exception rappresentano quasi tutte le condizioni eccezionali che si possono definire in librerie o applicazioni ● è possibile gestire un qualunque problema che si verifica a runtime nel codice lanciando una delle eccezioni runtime esistenti :
  • ce n’è a sufficienza per fronteggiare il tipo di errore che si è verificato,
  • oppure l'errore è sufficientemente generale che basta sollevare un'istanza di RuntimeException. ● Occasionalmente si può voler estendere una classe esistente di eccezioni runtime per fornire ulteriori informazioni sull'errore che si è verificato. ● Ancora più raramente, è possibile definire una nuova classe di eccezioni runtime specifica per il dominio applicazione.

RuntimeException e relative estensioni

31

Alcune tra le più importanti eccezioni Java

● NullPointerException extends RunTimeException

  • eccezione che viene lanciata quando si utilizza un puntatore nullo (invece di Segmentation Fault!!!). ● ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException extends RunTimeException :
  • eccezione che viene lanciata quando si legge un array (Vettore o Lista) con indice non corretto (Ancora avrei causato Segmentation Fault!!!). ● NumberFormatException extends IllegalArgumentException extends RunTimeException :
  • 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

eccezioni controllate e clausola throws

● le eccezioni controllate che un metodo può sollevare sono

dichiarate nell’header nella clausola throws

  • elencate in una lista, separate da “,”

– le eccezioni elencate sono solo quelle che non vengono

intercettate all’interno del metodo

● da una clausola catch nella struttura try-catch del metodo ● anche i costruttori di una classe possono sollevare eccezioni controllate a patto che le dichiarino ● le eccezioni rendono le condizioni di errore che un metodo può segnalare una parte esplicita del suo contratto.

33

eccezioni controllate e clausola throws

● la gestione rigorosa delle eccezioni controllate permette di evitare malfunzionamenti derivanti da dimenticanze di gestione degli errori ● la clausola throws riporta chiaramente le eccezioni controllabili/checkable che un metodo (o un costruttore) può sollevare ● il contratto definito dalla clausola throws si applica in maniera rigida: si può lanciare solo una eccezione controllata di un tipo (o sottotipo) dichiarato nella clausola throwsmetodi o costruttori privi di clausole throws non possono sollevare eccezioni controllate

  • possono sollevare solo eccezioni non controllate posso omettere throws IllegalArgumentException perché è una RunTimeException un esempio che solleva eccezione anche in costruttore

37

gestione o rilancio delle eccezioni

Come reagire al verificarsi delle eccezioni ● intercettare/catch e gestire l’eccezione all’interno del metodo col codice del blocco catch di una clausola try-catch

  • una eccezione si può gestire anche sollevandone una nuova ● intercettare l’eccezione e trasformarla in una delle eccezioni del contratto col chiamante, sollevando una eccezione di un tipo dichiarato nella clausola throws del chiamantepropagare verso il metodo chiamante il metodo deve dichiarare le eccezioni che può sollevate nella clausola throws rilanciare esplicitamente l’eccezione (eccetto main) all’esterno del metodo che contiene l’istruzione che l’ha provocata delega la gestione ad altri metodi della catena di invocazione propagazione di una eccezione il metodo chiamante (A)
  • riceve una eccezione lanciata dal metodo invocato (B) e non prevede di gestirla
  • termina in modo anomalo e chiamante C (^) A chiamato B

Quando viene sollevata una eccezione

quando viene sollevata una eccezione, l’istruzione / l’espressione che l’ha causata termina improvvisamente

  • L’esecuzione di una porzione di codice viene interrotta nel punto in cui viene sollevata l’eccezionele azioni successive a quel punto non avranno luogoQuesto vale per tutti i frammenti di codice dove sono presenti i metodi che lanciano (o rilanciano) una eccezione.
  • L’eccezione tiene traccia di tutti i punti del programma in cui l’eccezione stessa viene rilanciata. ● l’azione che occorre subito dopo che una eccezione viene sollevata è

definita in un blocco catch che cattura l’eccezione

….ma dove si trova?

Nota: può esserci una clausola finally che si preoccupa prima di effettuare operazioni di pulizia [vedi oltre]

39

le eccezioni possono essere

intercettate in modo selettivo

● un metodo chiamante

– se è in grado di trattare un certo tipo di eccezione e riportare

l’applicazione in uno stato consistente

● può prendere il controllo della situazione ( catch )

● evitando la propagazione ad altri metodi chiamanti e quindi la

terminazione dell’intero programma (arresta il rilancio)

39

rilancio delle eccezioni e comportamento di default

  • di default la propagazione (il rilancio) svuota lo stack di ambienti facendo terminare in modo anomalo tutti i metodi fino al raggiungimanto di main - a questo punto l’intero programma termina in modo anomalo e viene stampato un opportuno messaggio di errore che comprende - il tipo di eccezione - il messaggio usato per creare l’eccezione che dovrebbe descriverne le cause - l’elenco dei metodi che hanno provocato l’eccezione (fino al main) - per ogni metodo è indicata la classe di appartenenza e la linea di codice in cui è scaturita l’eccezione - il messaggio di errore è dettagliato à facilita la localizzazione finchè l’eccezione non viene intercettata (catch), la terminazione forzata del metodo (terminazione anomala) causa la riduzione graduale della catena delle chiamate causando la terminazione di ogni blocco di istruzioni o invocazione di metodo Uncaught Exception Handler