Eccezioni ed asserzioni
|
|
|
- Giovanni Gallo
- 9 anni fa
- Visualizzazioni
Transcript
1 Eccezioni ed asserzioni I concetti relativi ad eccezioni, errori ed asserzioni e le relative gestioni, permettono allo sviluppatore di scrivere del software robusto, ovvero che riesca a funzionare correttamente, anche in presenza di situazioni impreviste. In JAVA è possibile definire un eccezione come un situazione imprevista che il flusso di un applicazione può incontrare, esse vengono gestite utilizzando le seguenti parole chiave: try catch finally throw throws.
2 Attraverso esse sarà possibile creare eccezioni personalizzate e decidere non solo come, ma anche in quale parte del codice gestirle, e questo è implementato nella libreria Java mediante la classe Exception e le sue sottoclassi. Un esempio di eccezione è la divisione tra due variabili numeriche nella quale la variabile divisore ha valore 0. Possiamo definire un errore come una situazione imprevista non dipendente da un errore commesso dallo sviluppatore ma essi a differenza delle eccezioni non sono gestibili, questo concetto è implementato nella libreria Java mediante la classe Error e le sue sottoclassi. Un esempio di errore che potrebbe causare un programma è quello relativo alla terminazione delle risorse di memoria che ovviamente, non è gestibile.
3 Infine è possibile definire un asserzione come una condizione che deve essere verificata affinché lo sviluppatore consideri corretta una parte di codice. A differenza delle eccezioni e degli errori, le asserzioni rappresentano uno strumento da abilitare per testare la robustezza del software, ed eventualmente disabilitare in fase di rilascio. Questo concetto è implementato tramite la parola chiave assert. Un esempio un asserzione potrebbe essere quello di asserire che la variabile che deve fare da divisore in una divisione, deve essere diversa da 0, se questa condizione non dovesse verificarsi allora l esecuzione del codice sarà interrotta.
4 Nella libreria standard di Java, esiste una gerarchia di classi che mette in relazione, la classe Exception e la classe Error essendo entrambe estensioni della superclasse Throwable.
5 La JVM reagisce ad un eccezione-errore nel seguente modo: 1. Se il programma genera un eccezione, la JVM istanzia un oggetto dalla classe eccezione relativa al problema, e lancia l eccezione appena istanziata (tramite la parola chiave throw). 2. Se il nostro codice non cattura (tramite la parola chiave catch) l eccezione, il gestore automatico della JVM interromperà il programma generando in output informazioni dettagliate su ciò che è accaduto. Per esempio, se si prova ad eseguire una divisione per zero tra interi,la JVM istanzierà un oggetto di tipo ArithmeticException e lo lancerà, è come se la JVM eseguisse le seguenti righe di codice: ArithmeticException exc = new ArithmeticException(); throw exc;
6 Questo avviene in maniera totalmente trasparente. Se bisogna sviluppare una parte di codice che potenzialmente può scatenare un eccezione è possibile circondarlo con un blocco try seguito da uno o più blocchi catch. Per esempio: public class Ecc1 { public static void main(string args[]) { int a = 10; int b = 0; int c = a/b; System.out.println(c); }} Questa classe genererà un eccezione durante la sua esecuzione, dovuta all impossibilità di eseguire una divisione per zero.
7 In tal caso, la JVM dopo aver interrotto il programma produrrà il seguente output: Exception in thread "main" java.lang.arithmeticexception: / by zero at Ecc1.main(Ecc1.java:6) Il messaggio evidenzia: il tipo di eccezione (java.lang.arithmeticexception) un messaggio descrittivo (/ by zero) il metodo in cui è stata lanciata l eccezione (at Ecc1.main) il file in cui è stata lanciata l eccezione (Ecc1.java) la riga in cui è stata lanciata l eccezione (:6) L unico problema è che il programma è terminato prematuramente,ma utilizzando le parole chiave try e catch è possibile gestire l eccezione in maniera personalizzata: public class Ecc2 {
8 public static void main(string args[]) { int a = 10; int b = 0; try { int c = a/b; System.out.println(c);} catch (ArithmeticException exc) { System.out.println("Divisione per zero...");} }} Quando la JVM eseguirà tale codice incontrerà la divisione per zero della prima riga del blocco try, lancerà l eccezione ArithmeticException che verrà catturata nel blocco catch seguente e quindi non sarà eseguita la stampa di c, bensì la stringa Divisione per zero..., ed il programma di terminare in maniera naturale.
9 Si noti che il blocco catch deve dichiarare un parametro del tipo dell eccezione che deve essere catturata. Nell esempio il reference exc, puntava all eccezione che la JVM istanzia e lancia, e tramite esso è possibile reperire informazioni proprio sull eccezione stessa invocando il metodo printstacktrace() int a = 10; int b = 0; try { int c = a/b; System.out.println(c);} catch (ArithmeticException exc) { exc.printstacktrace();} }
10 Il metodo printstacktrace() produrrà in output i messaggi informativi che il programma avrebbe prodotto se l eccezione non fosse stata gestita, ma senza interrompere il programma stesso. Come per i metodi, anche per i blocchi catch i parametri possono essere polimorfi, come avviene nel seguente frammento di codice: int a = 10; int b = 0; try { int c = a/b; System.out.println(c);} catch (Exception exc) { exc.printstacktrace();}} in cui il blocco catch gestirebbe qualsiasi tipo di eccezione, essendo Exception, la superclasse da cui discende ogni altra eccezione, ed il reference exc, è in questo esempio, un parametro polimorfo.
11 È anche possibile far seguire ad un blocco try, più blocchi catch, come nel seguente esempio: int a = 10; int b = 0; try { int c = a/b; System.out.println(c);} catch (ArithmeticException exc) { System.out.println("Divisione per zero...");} catch (NullPointerException exc) { System.out.println("Reference nullo...");} catch (Exception exc) { exc.printstacktrace();}} Il blocco catch (Exception exc) {exc.printstacktrace();} deve essere posizionata in coda agl altri blocchi catch.
12 È anche possibile far seguire ad un blocco try, oltre a blocchi catch, un altro blocco finally, tutto ciò che è definito in esso viene eseguito in qualsiasi caso, sia se viene o non viene lanciata l eccezione, ad esempio: public void insertindb() { try {cmd.executeupdate("insert INTO ");} catch (SQLException exc) {exc.printstacktrace();} finally { try{connection.close();} catch (SQLException exc) { exc.printstacktrace();}} Questo codice tenta di eseguire una INSERT in un database, tramite le interfacce JDBC del package java.sql, cmd è un oggetto Statement e connection è un oggetto Connection, il comando executeupdate() ha come parametro il codice SQL e se ci sono errori la JVM lancerà una SQLException, che verrà catturata nel relativo blocco catch. In ogni caso la connessione al database deve essere chiusa.
13 Le eccezioni più frequenti sono Java: NullPointerException : probabilmente la più frequente tra le eccezioni. Viene lanciata dalla JVM, quando viene chiamato un metodo su di un reference che invece punta a null. ArrayIndexOutOfBoundsException : questa eccezione viene lanciata quando si prova ad accedere ad un indice di un array troppo alto. ClassCastException : eccezione particolarmente insidiosa. Viene lanciata al runtime quando si prova ad effettuare un cast ad un tipo di classe sbagliato. IOException e le sottoclassi FileNotFoundException, EOFException, etc. del package java.io SQLException del package java.sql ConnectException, il package java.net È comunque possibile definire nuovi tipi di eccezioni.
14 Ad esempio un programma che deve gestire in maniera automatica le prenotazioni per un teatro, potrebbe voler lanciare un eccezione nel momento in cui si tenti di prenotare un posto non più disponibile. In tal caso la soluzione è estendere la classe Exception, ed eventualmente aggiungere membri e fare override di metodi come tostring(). public class PrenotazioneException extends Exception { public PrenotazioneException() { // Il costruttore di Exception chiamato inizializza la // variabile privata message super("problema con la prenotazione"); } public String tostring() { return getmessage() + ": posti esauriti!"; } }
15 La JVM sa quando lanciare una ArithmeticException ma non sa quando lanciare una PrenotazioneException, e in questo caso si utilizza la parola chiave throw che lancia un eccezione tramite la seguente sintassi: PrenotazioneException exc = new PrenotazioneException(); throw exc; //o equivalentemente throw new PrenotazioneException(); Un codice di esempio try { //controllo sulla disponibilità dei posti if (postidisponibili == 0) { throw new PrenotazioneException();} //istruzione eseguita se non viene lanciata l eccezione postidisponibili--;} catch (PrenotazioneException exc){ System.out.println(exc.toString());}
16 Le asserzioni Un asserzione è un istruzione che permette di testare eventuali comportamenti che un applicazione deve avere. Ogni asserzione richiede che sia verificata un espressione booleana se questa non è verificata, allora si deve parlare di bug, quindi le asserzioni rappresentare un utile strumento per accertarsi che il codice scritto si comporti così come ci si aspetta. Esistono due tipi di sintassi per le asserzioni: 1. assert espressione_booleana; 2. assert espressione_booleana: espressione_stampabile; Con la sintassi 1) quando l applicazione esegue l asserzione valuta il valore dell espressione_booleana, se questo è true, il programma prosegue normalmente, ma se il valore è false viene lanciato l errore AssertionError.
17 Per esempio l istruzione: assert b > 0; è semanticamente equivalente a: if (!(b>0)) { throw new AssertionError(); } La sintassi 2) permette di specificare anche un messaggio esplicativo tramite l espressione_stampabile. assert b > 0; "il valore di b è " + b; Se la condizione che viene asserita dal programmatore è falsa, l applicazione terminerà immediatamente mostrando le ragioni tramite uno stacktrace (metodo printstacktrace() di cui sopra). È comunque possibile disabilitare la lettura delle asserzioni da parte della JVM, una volta rilasciato il proprio prodotto, al fine di non rallentarne l esecuzione.
Gestione delle eccezioni in Java
Gestione delle eccezioni in Java - Introduzione al concetto di eccezioni E possibile definire un eccezione come un situazione imprevista che il flusso di un applicazione può incontrare. È possibile gestire
Programmazione ad Oggetti
Programmazione ad Oggetti Java Eccezioni Eccezioni in breve Un eccezione è un oggetto che descrive una situazione anomala o di errore L eccezioni vengono lanciate da una parte di un programma e possono
Eccezioni predefinite
Eccezioni predefinite Java mette a disposizione molte eccezioni già confezionate, che descrivono la maggioranza dei problemi che possono verificarsi a run-time. Ognuna di queste è una classe. Tutte queste
Gestione delle eccezioni in Java
Gestione delle eccezioni in Java Fondamenti di Informatica Ingegneria Gestionale Canale AL 1 Le eccezioni in Java Exception handling: insieme di costrutti e regole sintattiche e semantiche presenti nel
Gestione degli Errori in Java. Emilio Di Giacomo e Walter Didimo
Gestione degli Errori in Java Emilio Di Giacomo e Walter Didimo Errori in fase di esecuzione Un programma può contenere o generare errori in fase di esecuzione, di varia natura: errori di robustezza: dovuti
19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo
19 - Eccezioni Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it Corso
FONDAMENTI DI INFORMATICA C Linguaggio Java: Eccezioni
Università degli Studi di Modena e Reggio Emilia Facoltà di Ingegneria CORSO DI FONDAMENTI DI INFORMATICA C Linguaggio Java: Eccezioni Prof. Zambonelli, Ing. Cabri, Ing. Denti, Ing. Andrea Aime Zambonelli,
GESTIONE DEGLI ERRORI
GESTIONE DEGLI ERRORI Spesso vi sono istruzioni critiche, che in certi casi possono produrre errori L approccio classico consiste nell inserire controlli (if else..) per cercare di intercettare a priori
Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014
Cognome................................ Nome................................... Matricola............................... Programmazione Prova scritta del 11 luglio 2014 TEMPO DISPONIBILE: 2 ore Negli esercizi
Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre 2014. Negli esercizi proposti si utilizzano le seguenti classi:
Cognome................................ Nome................................... Matricola............................... Programmazione Prova scritta del 22 settembre 2014 TEMPO DISPONIBILE: 2 ore Negli
RETI DI CALCOLATORI Linguaggio Java: Eccezioni
Università degli Studi di Modena e Reggio Emilia Facoltà di Ingegneria Reggio Emilia CORSO DI RETI DI CALCOLATORI Linguaggio Java: Eccezioni Prof. Franco Zambonelli Lucidi realizzati in collaborazione
Programmazione. Cognome... Nome... Matricola... Compitino del 17 gennaio 2007
Cognome............................. Nome................................ Programmazione Compitino del 17 gennaio 2007 Matricola............................ NOTA: Negli esercizi 1, 2, 3, 4 fate riferimento
Gestione delle Eccezioni
Gestione delle Eccezioni Condizioni di Errore Una condizione di errore in un programma può avere molte cause Errori di programmazione Divisione per zero, cast non permesso, accesso oltre i limiti di un
8. Java: Eccezioni e Thread
8. Java: Eccezioni e Thread Vittorio Scarano Algoritmi e Strutture Dati: Sistemi Distribuiti Corso di Laurea in Informatica Università degli Studi di Salerno Organizzazione della lezione Le eccezioni motivazioni
Gestione delle eccezioni
Gestione delle eccezioni Raffaella Brighi, a.a. 2007/08 Ereditarietà Corso di Algoritmi e programmazione. A.A. 2007-08 CdL Operatore Informatico Giuridico. Casi di insuccesso Vi sono numerosi problemi
Concetti Base Eccezioni Eccezioni e Metodi Gerarchia di Eccezioni. Java: Eccezioni. Damiano Macedonio
Dipartimento di Informatica, Università degli Studi di Verona Corso di Programmazione per Bioformatica lezione del 30 maggio 2014 Introduzione Un programma diviso in sezioni distinte Un approccio alla
Asserzioni in Java fondamenti
Asserzioni in Java fondamenti Cosa è un asserzione? Una assertion è una espressione booleana che deve essere true se e solo se il codice sta funzionando correttamente. Se l asserzione risulta falsa, viene
Le basi del linguaggio Java
Le basi del linguaggio Java Compilazione e interpretazione Quando si compila il codice sorgente scritto in Java, il compilatore genera il codice compilato, chiamato bytecode. È un codice generato per una
Le eccezioni in Java
Eccezioni 1 Le eccezioni in Java 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
Le classi in java. Un semplice programma java, formato da una sola classe, assume la seguente struttura:
Le classi in java Un semplice programma java, formato da una sola classe, assume la seguente struttura: class Domanda static void main(string args[]) System.out.println( Quanti anni hai? ); La classe dichiarata
"Programmazione Distribuita" - Prof. Scarano. Laurea in Informatica. A.A Università di Salerno 1. Organizzazione della lezione
Lezione 8 Eccezioni e Thread Vittorio Corso di Programmazione Distribuita Laurea di I livello in Informatica Università degli Studi di Salerno Programmazione Distribuita. Vi.ttorio Organizzazione della
Gerarchia delle classi Classi astratte Interfacce (Eccezioni) Laboratorio di Programmazione - Esercitazio 1
Gerarchia delle classi Classi astratte Interfacce (Eccezioni) Laboratorio di Programmazione - Esercitazio 1 Gerarchia delle classi Una sottoclasse eredita metodi, variabili, etc. dalla superclasse... Per
Programmazione a oggetti
Programmazione a oggetti Quanti oggetti, tra di loro parlando, fanno programmi. Pilu Crescenzi [email protected] Università di Firenze Programmazione a oggetti p.1/32 Cosa è un oggetto Una scatola software
JAVA GENERICS. Angelo Di Iorio Università di Bologna
JAVA GENERICS Angelo Di Iorio Università di Bologna Tipi parametrici In diversi casi è utile definire classi che operano su tipi di dato diverso e implementano un comportamento comune e indipendente dal
Corso: Fondamenti di Informatica (Gruppo 2) a.a Corsi di laurea: Ing. Settore Informazione
Corso: Fondamenti di Informatica (Gruppo 2) a.a. 2017-18 Corsi di laurea: Ing. Settore Informazione Questionario a Risposte Multiple per auto-valutazione del Lab05 Domanda n. 1 Argomento: Iterazioni, array
Uguaglianza e copia di oggetti
Uguaglianza e copia di oggetti Sommario 1. Classi Object e Class 2. Uguaglianza superficiale e uguaglianza profonda 3. Copia superficiale e copia profonda 4. Uguaglianza e copia in classi derivate 1 La
