Eccezioni in Java prof. Marcello Missiroli
ITIS F. Corni, Modena
Febbraio 2012
[email_address]
Tipi di eccezioni Hardware Generato dalla CPU in funzione di un errore (divisione per 0, Segmentazione, ecc.) Software Definito dal programmatore per tutti gli altri tipi di errore (spesso ricco di informazione). Dominio L'input o i parametri non sono del tipo previsto Range  Oltre la gamma prevista da un array. L'operazione non può continuare.  Monitor Stato di una operazione in corso
Gestione tradizionale Tradizionalmente le eccezioni erano gestite in due modalità: Forma parametrizzata
Forma basata sul linguaggio
Forma parametrizzata Indirizzo di una subroutine da chiamare durante un errore.
Nome di una label cui saltare in caso di errore.
Variabile di status modificata dall'operazione, e controllata dal programma chiamante al ritorno (stdio::errno e simili).
Forma basata sul linguaggio Subroutine di errore legate a un particolare tipo di dato.
Bersaglio di errore definito in fase di compilazione.
Istruzioni condizionate del PL/I
Problemi Come risolviamo questi problemi e lasciamo un sistema dove la gestione degli errori è inconsistente e evitabile per costruire un sistema moderno e strutturato logicamente? Basata sul linguaggio Un solo gestore per tipo o oggetto.
Il gestore è predefinito.
La soluzione PL/I funziona solo con il PL/I. Chiamate parametrizzate: Non è obbligatorio gestire i risultati eccezionali
Non si può sapere in fare di compilazione se l'eccezione sarà gestita.
Ridotto numero di coppie condizioni-gestori.
Vediamo un po' Prima vediamo come avvile la chiamata ai metodi nei linguaggi OOP
Nel nostro caso, in Java.
Chiamate ai metodi Classe.main()
Chiamate ai metodi oggetto1.metodo () Classe.main()
Chiamate ai metodi oggetto2.metodo () oggetto1.metodo () Classe.main()
Chiamate ai metodi oggetto2.metodo () oggetto1.metodo () Classe.main()
Chiamate ai metodi oggetto2.metodo () oggetto1.metodo () Classe.main()
Chiamate ai metodi oggetto2.metodo () oggetto1.metodo () Classe.main()
Problemi Poiché la catena di chiamate può essere molto lunga, se si verifica un problema può risultare molto difficile scoprire dove e perché si è verificato Errori di programmazione?
Errori di I/O?
Puntatori null?
...
Gestione delle eccezioni Il costrutto standard di Java (mutuato dal C++) è try … catch … finally che ha la seguente struttura: try {// Codice che può generare un errore o un eccezione} catch (ExceptionType identifier) {// Codice che gestisce l'eccezione } finally  {// Codice da eseguire in ogni caso }
Gestione delle eccezioni Il costrutto standard di Java (mutuato dal C++) è try … catch … finally che ha la seguente struttura: try  {// Codice che può generare un errore o un eccezione} catch  (ExceptionType identifier) {// Codice che gestisce l'eccezione } finally  {// Codice da eseguire in ogni caso } DEVE esistere ALMENO una clausola catch Finally è opzionale (poco usato)
Come funziona? main () try { num = Integer.parseInt (s); } : catch (NumberFormatException e) { : }
Come funziona? Integer.parseInt (String s) { :   : } main () try { num = Integer.parseInt (s); } : catch (NumberFormatException e) { : }
Come funziona? Integer.parseInt (String s) { L'utente NON inserisce un numero  corretto!!!
} main () try { num = Integer.parseInt (s); } : catch (NumberFormatException e) { : }
Come funziona? Integer.parseInt (String s) { NumberFormatException e = new NumberFormatException (); } main () try { num = Integer.parseInt (s); } : catch (NumberFormatException e) { : }
Come funziona? Integer.parseInt (String s) { :   : } main () try { num = Integer.parseInt (s); } : catch (NumberFormatException e) { L'eccezione deve essere gestita qui }
Come gestire? Messaggi di errore comprensibili
Assegnare valori ”sicuri”
Risolvere situazioni ”sospese”
...ecc... Ricordarsi che l'eccezione è un oggetto, e come tale ha metodi interessanti, quali .toString() .getMessage(), .printStackTrace().
A questo punto sappiamo che... Ogni blocco  try  deve avere almeno un blocco catch
Se si verifica  un'eccezione all'interno di un blocco  try :  Il resto del codice del blocco  try  viene saltato.

More Related Content

PPT
Java lezione 5
PDF
Algoritmi e Programmazione Avanzata - Esercizi propedeutici
PDF
Algoritmi e Programmazione Avanzata - Ordinamento e ricorsione
PDF
(My) Best Practices in Symfony
PPTX
Mettiamoci la faccia: face detection, recognition e landmark per applicazioni...
PDF
Vulnerabilità exploit
PPTX
Test double - un'introduzione (PHP)
PDF
Hat 2008
Java lezione 5
Algoritmi e Programmazione Avanzata - Esercizi propedeutici
Algoritmi e Programmazione Avanzata - Ordinamento e ricorsione
(My) Best Practices in Symfony
Mettiamoci la faccia: face detection, recognition e landmark per applicazioni...
Vulnerabilità exploit
Test double - un'introduzione (PHP)
Hat 2008

Viewers also liked (19)

ODP
Uefi: l'eterna lotta tra il bene e il male
PPT
Programmazione a oggetti tramite la macchina del caffé (pt. 3)
PPT
Corso Moodle: presentazione
ODP
Il ciclo for
PDF
Ruby in 25 minuti
ODP
Lo stack: tipo di dato astratto e implementazione in Java
PPT
Corso Moodle: perché?
ODP
L'avvento del programmatore sociale
PPT
Moodle: i compiti (homework)
ODP
Investire nelle user story
ODP
Routing dinamico
ODP
Espressioni regolari
ODP
The Sequel to sql
ODP
Controllo di versione e Git
PPT
Java Advanced
ODP
Introduzione al dns
PPT
Il sistema binario
ODP
Insegnare Agile
Uefi: l'eterna lotta tra il bene e il male
Programmazione a oggetti tramite la macchina del caffé (pt. 3)
Corso Moodle: presentazione
Il ciclo for
Ruby in 25 minuti
Lo stack: tipo di dato astratto e implementazione in Java
Corso Moodle: perché?
L'avvento del programmatore sociale
Moodle: i compiti (homework)
Investire nelle user story
Routing dinamico
Espressioni regolari
The Sequel to sql
Controllo di versione e Git
Java Advanced
Introduzione al dns
Il sistema binario
Insegnare Agile
Ad

Similar to Eccezioni in java (20)

PPT
Java codestyle & tipstricks
ODP
Javaday 2006: Java 5
PPT
Riepilogo Java C/C++
PPT
Oracle contract by desing la gestione errori
ODP
PDF
Java OCA teoria 5
PPT
Primo Incontro Con Scala
ODP
Pycon Jungle
PDF
Webbit 2004: Tiger, java
PPT
Applicazioni native in java
PDF
20090124 Ricette per Eliminare gli IF @JavaDay3 Roma-IT [ITA]
PDF
Googletest, tdd e mock
PDF
LINQ, Entities Framework & ORMs
PPT
iContract
PPTX
Dal C a Java (2/3)
PDF
Devianze
PPT
A static Analyzer for Finding Dynamic Programming Errors
PDF
Lezione 12 (28 marzo 2012)
PDF
Lezione 12 (28 marzo 2012)
ODP
Mocking Objects Practices
Java codestyle & tipstricks
Javaday 2006: Java 5
Riepilogo Java C/C++
Oracle contract by desing la gestione errori
Java OCA teoria 5
Primo Incontro Con Scala
Pycon Jungle
Webbit 2004: Tiger, java
Applicazioni native in java
20090124 Ricette per Eliminare gli IF @JavaDay3 Roma-IT [ITA]
Googletest, tdd e mock
LINQ, Entities Framework & ORMs
iContract
Dal C a Java (2/3)
Devianze
A static Analyzer for Finding Dynamic Programming Errors
Lezione 12 (28 marzo 2012)
Lezione 12 (28 marzo 2012)
Mocking Objects Practices
Ad

More from Marcello Missiroli (11)

PDF
Algorithmist guide II
PPTX
Guida del perfetto Algoritmista I
ODP
Workshop: Introduzione ad TDD
PPTX
Dal c a Java (3/3)
PPTX
Dal C a Java (1/3)
ODP
PPT
Sviluppo degli algoritmi
PPTX
5 stadi dello sviluppo di un gruppo
PDF
Vogliamo programmatori stupidi e pigri!
PPTX
Big O Notation
ODP
Introduzione a java doc
Algorithmist guide II
Guida del perfetto Algoritmista I
Workshop: Introduzione ad TDD
Dal c a Java (3/3)
Dal C a Java (1/3)
Sviluppo degli algoritmi
5 stadi dello sviluppo di un gruppo
Vogliamo programmatori stupidi e pigri!
Big O Notation
Introduzione a java doc

Eccezioni in java

  • 1. Eccezioni in Java prof. Marcello Missiroli
  • 2. ITIS F. Corni, Modena
  • 5. Tipi di eccezioni Hardware Generato dalla CPU in funzione di un errore (divisione per 0, Segmentazione, ecc.) Software Definito dal programmatore per tutti gli altri tipi di errore (spesso ricco di informazione). Dominio L'input o i parametri non sono del tipo previsto Range Oltre la gamma prevista da un array. L'operazione non può continuare. Monitor Stato di una operazione in corso
  • 6. Gestione tradizionale Tradizionalmente le eccezioni erano gestite in due modalità: Forma parametrizzata
  • 7. Forma basata sul linguaggio
  • 8. Forma parametrizzata Indirizzo di una subroutine da chiamare durante un errore.
  • 9. Nome di una label cui saltare in caso di errore.
  • 10. Variabile di status modificata dall'operazione, e controllata dal programma chiamante al ritorno (stdio::errno e simili).
  • 11. Forma basata sul linguaggio Subroutine di errore legate a un particolare tipo di dato.
  • 12. Bersaglio di errore definito in fase di compilazione.
  • 14. Problemi Come risolviamo questi problemi e lasciamo un sistema dove la gestione degli errori è inconsistente e evitabile per costruire un sistema moderno e strutturato logicamente? Basata sul linguaggio Un solo gestore per tipo o oggetto.
  • 15. Il gestore è predefinito.
  • 16. La soluzione PL/I funziona solo con il PL/I. Chiamate parametrizzate: Non è obbligatorio gestire i risultati eccezionali
  • 17. Non si può sapere in fare di compilazione se l'eccezione sarà gestita.
  • 18. Ridotto numero di coppie condizioni-gestori.
  • 19. Vediamo un po' Prima vediamo come avvile la chiamata ai metodi nei linguaggi OOP
  • 20. Nel nostro caso, in Java.
  • 21. Chiamate ai metodi Classe.main()
  • 22. Chiamate ai metodi oggetto1.metodo () Classe.main()
  • 23. Chiamate ai metodi oggetto2.metodo () oggetto1.metodo () Classe.main()
  • 24. Chiamate ai metodi oggetto2.metodo () oggetto1.metodo () Classe.main()
  • 25. Chiamate ai metodi oggetto2.metodo () oggetto1.metodo () Classe.main()
  • 26. Chiamate ai metodi oggetto2.metodo () oggetto1.metodo () Classe.main()
  • 27. Problemi Poiché la catena di chiamate può essere molto lunga, se si verifica un problema può risultare molto difficile scoprire dove e perché si è verificato Errori di programmazione?
  • 30. ...
  • 31. Gestione delle eccezioni Il costrutto standard di Java (mutuato dal C++) è try … catch … finally che ha la seguente struttura: try {// Codice che può generare un errore o un eccezione} catch (ExceptionType identifier) {// Codice che gestisce l'eccezione } finally {// Codice da eseguire in ogni caso }
  • 32. Gestione delle eccezioni Il costrutto standard di Java (mutuato dal C++) è try … catch … finally che ha la seguente struttura: try {// Codice che può generare un errore o un eccezione} catch (ExceptionType identifier) {// Codice che gestisce l'eccezione } finally {// Codice da eseguire in ogni caso } DEVE esistere ALMENO una clausola catch Finally è opzionale (poco usato)
  • 33. Come funziona? main () try { num = Integer.parseInt (s); } : catch (NumberFormatException e) { : }
  • 34. Come funziona? Integer.parseInt (String s) { : : } main () try { num = Integer.parseInt (s); } : catch (NumberFormatException e) { : }
  • 35. Come funziona? Integer.parseInt (String s) { L'utente NON inserisce un numero corretto!!!
  • 36. } main () try { num = Integer.parseInt (s); } : catch (NumberFormatException e) { : }
  • 37. Come funziona? Integer.parseInt (String s) { NumberFormatException e = new NumberFormatException (); } main () try { num = Integer.parseInt (s); } : catch (NumberFormatException e) { : }
  • 38. Come funziona? Integer.parseInt (String s) { : : } main () try { num = Integer.parseInt (s); } : catch (NumberFormatException e) { L'eccezione deve essere gestita qui }
  • 39. Come gestire? Messaggi di errore comprensibili
  • 42. ...ecc... Ricordarsi che l'eccezione è un oggetto, e come tale ha metodi interessanti, quali .toString() .getMessage(), .printStackTrace().
  • 43. A questo punto sappiamo che... Ogni blocco try deve avere almeno un blocco catch
  • 44. Se si verifica un'eccezione all'interno di un blocco try : Il resto del codice del blocco try viene saltato.
  • 45. Se c'è un blocco catch del tipo corretto (o di una sottoclasse), si esegue.
  • 46. Se c'è un blocco finally , si esegue; in caso contrario, si prosegue. Se non si verifica un'eccezione all'interno del blocco try e non c'è un'istruzione System.exit() : Se c'è un blocco finally , lo si esegue
  • 47. Ci siamo? Tirate un attimo il fiato, che si prosegue con cose più complicate.
  • 48. Tipi di Eccezioni Throwable Error VirtualMachineError OutOfMemoryError Exception … IOException RunTime Exception … ??? Excerpt from Big Java by C. Horstmann p. 562 Classe base delle eccezioni Solo questo tipo base può essere ”lanciato” dal gestore delle eccezioni
  • 49. Tipi di Eccezioni Throwable Error VirtualMachineError OutOfMemoryError Exception … IOException RunTime Exception … ??? Excerpt from Big Java by C. Horstmann p. 562 Errore Solitamente molto grave e irrecuperabile. Può non essere intercettato ( Unchecked Exception )
  • 50. Tipi di Eccezioni Throwable Error VirtualMachineError OutOfMemoryError Exception … IOException RunTime Exception … ??? Excerpt from Big Java by C. Horstmann p. 562 Eccezioni Prevedibile e gestibili Devono essere intercettate o dichiarate (C hecked Exception )
  • 51. Eccezione controllata Se l'eccezione si genera qui.. oggetto2.metodo () oggetto1.metodo () Classe.main()
  • 52. Eccezione controllata Se l'eccezione si genera qui.. oggetto2.metodo () oggetto1.metodo () Classe.main() ..o viene ”catturata” dall'oggetto stesso..
  • 53. Eccezione controllata Se l'eccezione si genera qui.. oggetto2.metodo () oggetto1.metodo () Classe.main() ..o si propaga verso l'alto, potenzialmente bloccando il programma
  • 54. Eccezione controllata Se non si intende gestire l'eccezione, la cosa va segnalata nella dichiarazione del metodo o della classe con la parola chiave ”throws” class Oggetto2 { private int attr1; private int attr2: … . public int getAttr1() { … }; } class Oggetto2 throws IOException { private int attr1; private int attr2: … . public int getAttr1() { … }; }
  • 55. Eccezioni non controllate standard int [] arr = null; arr[0] = 1; arr = new int [4]; int i; for (i = 0; i <= 4; i++) arr[i] = i; arr[i-1] = arr[i-1] / 0;
  • 56. Eccezioni non controllate standard int [] arr = null; arr[0] = 1; arr = new int [4]; int i; for (i = 0; i <= 4; i++) arr[i] = i; arr[i-1] = arr[i-1] / 0; NullPointerException
  • 57. Eccezioni non controllate standard int [] arr = null; arr[0] = 1; arr = new int [4]; int i; for (i = 0; i <= 4; i++) arr[i] = i; arr[i-1] = arr[i-1] / 0; ArrayIndexOutOfBoundsException (quando i = 4)
  • 58. Eccezioni non controllate standard int [] arr = null; arr[0] = 1; arr = new int [4]; int i; for (i = 0; i <= 4; i++) arr[i] = i; arr[i-1] = arr[i-1] / 0; ArithmeticException (Divisione per zero)
  • 59. Eccezioni non controllate: riassunto Il compilatore non vi obbliga a catturarli, se si verificano (non siete quindi obbligati a usare try ... catch )
  • 60. Si possono verificare in qualsiasi momento (non solo all'interno di un metodo)
  • 61. Sono di solito errori di esecuzione fatali al di là del controllo del programmatore
  • 62. Laddove possibile, si evitano con instruzioni condizionali
  • 63. Eccezioni controllate standard String urlStr = &quot;piffy.com:88/register.jsp?name=joe&quot;; try { URL url = new URL(urlStr); InputStream is = url.openStream(); is.close(); } catch (MalformedURLException e) { System.out.println(&quot;URL &quot;+urlStr+&quot; non valida: &quot;+e.getMessage()); } catch (IOException e) { System.out.println(&quot;Impossibile eseguire &quot;+urlStr+&quot;: &quot;+e.getMessage()); }
  • 64. Eccezioni controllate standard String urlStr = &quot; piffy.com:88/register.jsp?name=joe&quot; ; try { URL url = new URL(urlStr); InputStream is = url.openStream(); is.close(); } catch (MalformedURLException e) { System.out.println(&quot;URL &quot;+urlStr+&quot; non valida: &quot;+e.getMessage()); } catch (IOException e) { System.out.println(&quot;Impossibile eseguire &quot;+urlStr+&quot;: &quot;+e.getMessage()); } MalformedURLException (manca il protocollo)
  • 65. Eccezioni controllate standard String urlStr = &quot;http://piffy.com:88/register.jsp?name=joe&quot;; try { URL url = new URL(urlStr); InputStream is = url.openStream(); is.close(); } catch (MalformedURLException e) { System.out.println(&quot;URL &quot;+urlStr+&quot; non valida: &quot;+e.getMessage()); } catch (IOException e) { System.out.println(&quot;Impossibile eseguire &quot;+urlStr+&quot;: &quot;+e.getMessage()); } IOException (manca la connessione)
  • 66. Eccezioni controllate: riassunto Devono essere gestite se c'è il potenziale per un errore (tramite try ... catch )
  • 67. Si occupano di problemi che si verificano in una specifica sezione del codice.
  • 70. Lanciare le eccezioni Se volete forzatamente lanciare un'eccezione, potete usare l'istruzione throw if (a==0) throw new IllegalArgumentException();
  • 71. throw new NullPointerException ( ”Messaggio”); Poiché le eccezioni sono oggetti, è possibile creare sottoclassi personalizzati. Ma per i nostri scopi le eccezioni esistenti sono più che sufficienti.
  • 73. Esercizi Leggere un numero intero tramite System.in.readln.
  • 74. Creare un array di interi, usare un indice negativo e segnalare la cosa con un messaggio
  • 75. Nel costruttore di un oggetto ”Orario”, lanciare un'eccezione nel caso l'ora fornita sia <0 o >23 e i minuti siano <0 o >59. Scrivere un main che testi il programma.
  • 76. Licenza Queste slides traggono ispirazione, tra le altre cose, dalle slides ”Exceptions in Java” di Christian Ratliff < [email_address] > e “Java Exception Handling” di James Tam (università di Calgary)
  • 77. La licenza per questo lavoro è Creative Commons BY-SA 3.0 ( http://creativecommons.org/licenses/by-sa/3.0/ )