Introduzione alla programmazione con linguaggio Java 2004 {Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba }
Note di Copyright Queste trasparenze (slide) sono coperte dalle leggi sul copyright. Testi grafica e immagini in essa contenuti sono di proprietà dei rispettivi autori: Dott.ssa Emma Calabresu,, Dr. Maurizio Carta, Ing.. Mauro Ennas, Ing.. Stefano Piras e Ing.. Fabrizio Saba. Tali slide possono essere duplicate e riprodotte dalle scuole di ogni ordine e grado italiane o estere per applicazioni legate alla didattica e senza finalità di lucro. Ogni altra finalità o uso (ivi compresa la duplicazione su supporto magnetico, la trasmissione, la memorizzazione e la stampa totale o parziale) è vietata senza autorizzazione scritta da parte degli autori. Gli autori non si assumono nessuna responsabilità sulle informazioni contenute in queste slide che sono state realizzate per finalità meramente didattiche e sono aggiornate alla data riportata in calce. L intestazione a piè pagina deve comunque non essere alterata e deve sempre essere riportata anche in un utilizzo parziale del suddetto materiale.
Indice del corso Modulo 1: Introduzione Modulo 2: Sintassi Java Modulo 3: Oggetti e Classi Modulo 4: Features Modulo 5: Eccezioni Modulo 6: GUI Modulo 7: Extra
Modulo 5 Eccezioni 2004 {Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba }
In questo modulo Categorie d eccezioni Try e catch Identificare le eccezioni Esercitazioni con esempi
Eccezioni Programmazione Java SDK 2.0 2004 {Dott.ssa E. Calabresu, Dr. M. Carta, Ing. M. Ennas, Ing. S. Piras, Ing. F. Saba }
Eccezioni Java è nato come linguaggio di programmazione per hardware specializzato, come i cellulari e semplici strumenti di uso anche quotidiano; nella visione dei padri di Java erano anche i phon e i tostapane In queste applicazioni è importante che gli errori siano gestiti appropriatamente. Poiché è impossibile che non si verifichino, bisogna riconoscerli e tutelarsi contro le conseguenze
Eccezioni Java gestisce gli errori a livello applicativo con delle vere e proprie corsie d emergenza : quando qualcosa va male, il programma esce dal normale flusso e corre in una corsia d emergenza, terminando in maniera dolce. Queste corsie d emergenza sono gestite dalle eccezioni (Exceptions)
Eccezioni: catch & throw Ogni metodo nel quale si possano verificare errori irrimediabili problemi di lettura o scrittura, invasioni di memoria, ecc. deve gestire questi errori ( catturarli, catch), Oppure Segnalarne la presenza e demandare ad altri la gestione ( rilanciarli, throw)
Eccezioni: lancio di un eccezione Ogni metodo dovrebbe contemplare la possibilità, in caso di errore, di lanciare un eccezione, cioè di istanziare un oggetto della classe java.lang.exception o delle sue sottoclassi somemethod ( ) throw Exception { // se qualcosa va male: Exception ex = new Exception ( ); throw ex; } Il metodo deve dichiarare che sta lanciando un eccezione Lancio dell eccezione
Eccezioni: esempio L esercizio seguente illustra come si lancia un eccezione all interno di un metodo: Rettangolo9.java
Eccezioni: cattura di un eccezione Ogni eccezione lanciata deve essere catturata in un punto scelto del codice per essere gestita; in pratica, per attivare la corsia d emergenza : ciò si realizza con il try & catch : Supponiamo che un metodo readfromfile lanci una Exception, e vediamo come catturarla
Eccezioni: cattura di un eccezione Se nasce un oggetto Exception, il codice salta dentro il catch: try { readfromfile ( a.txt ); } Catch (Exception e) { // gestione dell eccezione }
Eccezioni: esempio L esercizio seguente illustra come si cattura un eccezione lanciata da un metodo ExException1.java Rettangolo9.java
Eccezioni: le classi Le eccezioni sono istanziate dalla classe: java.lang.exception E dalle sue sottoclassi. Alcune di queste possono contenere dell informazione specializzata, altre servono solo come sottoclassi con nomi più appropriati I vari packages definiscono i propri tipi di eccezioni; ad esempio, java.io ha FileNotFoundException, IOException, ecc
Eccezioni: esempi del package java.lang Object ClassNotFoundException InstantiationException Throwable Exception NoSuchMethodException ClassCastException IndexOutOfBoundsException RuntimeException NullPointerException
Eccezioni: gestione di più eccezioni Un metodo può catturare più eccezioni è gestirle separatamente. Se per esempio il metodo readfromfile lancia FileNotFoundException e IOException, queste si possono gestire in modi diversi.
Eccezioni: gestione di più eccezioni Primo modo: try { readfromfile ( a.txt ); } Catch (FileNotFoundException ex) { // gestione della situazione } Catch (IOException ex) { // gestisce quest latra situazione } Catch (Exception ex) { // gestisce tutte le altre eccezioni } Quest ultimo copre tutti gli altri casi, essendo Exception superclasse di tutte le eccezioni
Eccezioni: gestione di più eccezioni Se, alternativamente, si vuole solo deviare il flusso del programma senza preoccuparsi del tipo di eccezione, si cattura genericamente Exception try { readfromfile ( a.txt ); } Catch (Exception ex) { // gestisce tutti i casi qui }
Eccezioni: esempio L esercizio seguente illustra la gestione separata di più eccezioni: ExInterfaccia9.java
Eccezioni: bubbling up Se un metodo non vuole gestire eccezioni che nascono al suo interno, può rilanciarle. Abbiamo visto che un eccezione si lancia throw, e il metodo che la lancia deve dichiarare che intende farlo. Se un metodo non lancia di per se eccezioni, ma contiene altri metodi che ne lanciano, per rilanciarle deve dichiarare che intende farlo
Eccezioni: bubbling up Void amethod ( ) throw FileNotFoundException, IOException { readfromfile ( a.txt ); } oppure Void amethod ( ) throw Exception { readfromfile ( a.txt ); }
Eccezioni: bubbling up Alcune eccezioni possono essere catturate e altre rilanciate: Void amethod ( ) throw IOException { try { readfromfile( a.txt ); catch (FileNotFoundException ex) { } } Ancora, si può catturare un eccezione e, dentro il catch, lanciarne un altra
Eccezioni: il finally Supponiamo di voler uscire da casi sdi eccezione in maniera pulita, magari liberando memoria utilizzata. Per evitare di duplicare linee di codice in ogni catch e allo stesso tempo per mettere in evidenza le operazioni di cleanup, si usa il blocco finally, che compare per ultimo dopo tutti i catch. Esso è sempre eseguito indipendentemente dal tipo di uscita.
Eccezioni: il finally Se qualcosa va male, si entra in uno dei blocchi catch e il finally viene eseguito dopo il catch. Se viene lanciata un eccezione che il metodo rilancia, il finally viene eseguito prima che l eccezione si propaghi al livello successivo. Se il try va a buon fine, o anche se si esegue un return o un break, il finally viene eseguito Eventualmente, per eseguire operazioni di cleanup, si può usare try con finally senza catch
Eccezioni: uso di finally try { } catch (FileNotFoundException ex) { } catch (IOException ex) { } catch (Exception ex) { } finally { // Operazioni di cleanup }
Errori Nelle API Java vi è anche la classe java.lang.error per gli errori irrecuperabili. Gli Error non necessitano di cattura, per cui il programmatore non se ne preoccupa. Essi indicano di norma errori di link o della virtual machines, che causano l uscita dell interprete dal codice
Errori: alcune sottoclassi di java.lang.error Object Throwable LinkageError Error ThreadDeath VirtualMachinesError
Conclusioni Abbiamo visto: Cosa sono le eccezioni e in che modo possono essere gestite Cosa sono gli errori
Richiami e suggerimenti Importante: Imparare una corretta gestione delle eccezioni, studiando dove sia opportuno catturarle e dove invece rilanciarle
Grazie per l attenzione Domande?