Eccezioni in java

1,467 views

Published on

Una introduzione passo-passo al sistema delle gestioni in Java.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,467
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
33
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Eccezioni in java

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

×