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


Appunti eccezioni in Java, Appunti di Programmazione Java

Appunti in italiano su cosa sono le eccezioni in Java e come si gestiscono. In particolare, nel documento si parla di: - checked / unchecked expections; - come lanciare un'eccezione con la keyword throw; - complete delegation, partial delegation e no delegation delle eccezioni; - blocco try - catch - finally; - blocco try - with - resources;

Tipologia: Appunti

2023/2024

In vendita dal 14/09/2024

GB29
GB29 🇮🇹

13 documenti

1 / 5

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
ECCEZIONI IN JAVA
Le eccezioni sono gli errori rilevati durante l'esecuzione del programma (in fase di runtime), i
quali interrompono la normale esecuzione del programma stesso.
Prima delle eccezioni si gestivano gli errori in due modi: facendo terminare bruscamente
l’esecuzione del programma oppure facendo ritornare un valore speciale (metodo molto
simile a come è usato nel C). Entrambi i modi però presentano dei problemi:
- terminare l'esecuzione dentro un metodo deve essere evitato perché comporta ad
avere codice non riutilizzabile. Come sappiamo, nella programmazione Java si tende
a riutilizzare il codice già scritto piuttosto che scriverne altro (DRY rule);
- l’uso di valori speciali implica che ogni programmatore che si trovi di fronte a quel
codice sappia il significato di ogni valore di ritorno (- 1 = errore nell’apertura file, - 2 =
errore nella lettura del file, - 3 …). In più solo il metodo diretto chiamante può
intercettare l’errore, non c’è nessuna delegazione a metodi superiori.
In Java e in molti altri linguaggi si è passati alla trattazione degli errori usando le eccezioni.
Il codice che causa un errore genera un’eccezione, che causa l’interruzione dell’esecuzione
del codice e risale lo stack delle chiamate. Ad un certo punto, lungo la gerarchia dei metodi
invocanti, qualcuno può decidere di intercettare questa eccezione e gestirla. Tutti i metodi in
questa catena posso fare fondamentalmente tre cose:
1. intercettare l’eccezione (no delegation): assenza di delega, l’eccezione viene
intercettata attraverso un blocco catch e sempre dentro viene gestita;
2. ignorare l’eccezione (complete delegation): la lasciano scorrere verso il main,
passano la responsabilità al loro chiamante;
3. intercettare e generare una nuova eccezione (partial delegation): gestisco
l’eccezione che arriva e notifico i miei chiamanti qualcos’altro;
Gerarchia delle eccezioni
Le eccezioni sono considerate oggetti di classi speciali organizzate in una gerarchia di
classi. L'immagine seguente illustra la gerarchia semplificata delle eccezioni:
pf3
pf4
pf5

Anteprima parziale del testo

Scarica Appunti eccezioni in Java e più Appunti in PDF di Programmazione Java solo su Docsity!

ECCEZIONI IN JAVA

Le eccezioni sono gli errori rilevati durante l'esecuzione del programma (in fase di runtime), i quali interrompono la normale esecuzione del programma stesso. Prima delle eccezioni si gestivano gli errori in due modi: facendo terminare bruscamente l’esecuzione del programma oppure facendo ritornare un valore speciale (metodo molto simile a come è usato nel C). Entrambi i modi però presentano dei problemi:

  • terminare l'esecuzione dentro un metodo deve essere evitato perché comporta ad avere codice non riutilizzabile. Come sappiamo, nella programmazione Java si tende a riutilizzare il codice già scritto piuttosto che scriverne altro (DRY rule);
  • l’uso di valori speciali implica che ogni programmatore che si trovi di fronte a quel codice sappia il significato di ogni valore di ritorno (- 1 = errore nell’apertura file, - 2 = errore nella lettura del file, - 3 …). In più solo il metodo diretto chiamante può intercettare l’errore, non c’è nessuna delegazione a metodi superiori. In Java e in molti altri linguaggi si è passati alla trattazione degli errori usando le eccezioni. Il codice che causa un errore genera un’eccezione, che causa l’interruzione dell’esecuzione del codice e risale lo stack delle chiamate. Ad un certo punto, lungo la gerarchia dei metodi invocanti, qualcuno può decidere di intercettare questa eccezione e gestirla. Tutti i metodi in questa catena posso fare fondamentalmente tre cose:
  1. intercettare l’eccezione ( no delegation ): assenza di delega, l’eccezione viene intercettata attraverso un blocco catch e sempre lì dentro viene gestita;
  2. ignorare l’eccezione ( complete delegation ): la lasciano scorrere verso il main, passano la responsabilità al loro chiamante;
  3. intercettare e generare una nuova eccezione ( partial delegation ): gestisco l’eccezione che arriva e notifico i miei chiamanti qualcos’altro;

Gerarchia delle eccezioni

Le eccezioni sono considerate oggetti di classi speciali organizzate in una gerarchia di classi. L'immagine seguente illustra la gerarchia semplificata delle eccezioni:

La classe Throwable fornisce alcuni metodi comuni per le sue due sottoclassi: Error ed Exception. La prima rappresenta eventi di basso livello che si verificano all’interno di Java Virtual Machine (es: OutOfMemoryError) mentre la seconda classe rappresenta gli eventi che si verificano all’interno dell’applicazione (es: RuntimeException, IOException). In particolare, all’interno delle eccezioni possiamo distinguere due categorie: → Checked exception : se un metodo lancia un’eccezione di questo tipo allora nella sua dichiarazione dovrà aggiungere la keyword throws seguito dal tipo di eccezione lanciata altrimenti il programma non compilerà. Il compilatore controlla se il programmatore si aspetta delle eccezioni di questo tipo dal programma. → Unchecked exception : il compilatore non controlla se il programmatore si aspetta delle eccezioni di questo tipo nel programma. Il codice compilerà anche senza l’aggiunta della keyword nella dichiarazione del metodo poiché la loro aggiunta renderebbe il codice meno leggibile. Infatti queste eccezioni sono così comuni che controllarle ogni volta renderebbe illeggibile il codice. Anche la classe Error e le sue sottoclassi sono considerate unchecked eccezioni. Ogni oggetto della classe Throwable e delle sue sottoclassi può essere lanciato usando la keyword throw seguito dall’oggetto da lanciare. Si lanciano eccezioni solo quando le precondizioni del metodo corrente sono rotte e non si può proseguire con il programma. Esempio: public class Main { public static void main(String args[]) { throw new RuntimeException("Something's bad."); } }

NO DELEGATION

Il metodo corrente tratta l’errore e l’eccezione che viene generata. Per trattare un’eccezione si utilizza un blocco chiamato try-catch : il blocco try contiene il codice che potrebbe generare un’eccezione mentre il blocco catch gestisce le eccezioni che gli sono state specificate e le loro sottoclassi Esempio: Public static void main(String[] args) { char[] v = new char[256]; try { FileReader f = new FileReader(“text.txt”); } catch (FileNotFoundException e) { e.printStackTrace(); } } L’ordine con cui metto le eccezioni che si possono generare nel catch è in alto quelle più particolari e in basso quelle generali. Questo perché quando un metodo genera un’eccezione questa parte dalla prima e le scorre tutte finchè non trova un match, se fa

⇒ Esiste un ulteriore blocco che si può aggiungere al try-catch che si chiama finally. E’ un blocco che la Java Virtual Machine esegue sempre alla fine, indipendentemente che l’esecuzione abbia eseguito tutto il blocco try o che sia passata per il blocco catch a causa di eccezioni. Il blocco finally viene solitamente usato per pulire le ultime cose, come ad esempio chiudere i file, le connessioni di rete, le connessioni ai database, …. Gli errori dentro a questo blocco non possono essere recuperati, ma vengono solo notificati all’utente attraverso una RunTimeException(). Esempio: Public static void main(String[] args) { char[] v = new char[256]; FileReader f = null; try { f.new FileReader(“text.txt”); f.read(v); f.close(); } catch (IOException e) { //do something } finally { try { if (f != null) f.close(); } catch (IOException e) { throw new RunTimeException(); } } } Differenza tra try { … } e try ( .. ) { … }

1. try { … } (blocco try-catch tradizionale): Questo è il blocco tradizionale usato per gestire le eccezioni in Java. Serve semplicemente per racchiudere del codice che potrebbe generare eccezioni, e viene usato con blocchi catch e opzionalmente finally per catturare e gestire le eccezioni. Esempio: try { // Codice che potrebbe lanciare un'eccezione } catch (ExceptionType e) { // Gestione dell'eccezione } finally { // (Opzionale) Codice che viene sempre eseguito, sia in caso di eccezione che no }

2. try ( … ) { … } (blocco try-with-resources): Questo è il costrutto introdotto in Java 7 per la gestione automatica delle risorse, chiamato try-with-resources. Serve per gestire automaticamente la chiusura delle risorse che implementano l'interfaccia AutoCloseable (ad esempio, file, socket, stream, ecc.). Le risorse dichiarate all'interno delle parentesi tonde vengono chiuse automaticamente alla fine del blocco, senza la necessità di un blocco finally esplicito. Esempio: try (ResourceType resource = new ResourceType()) { // Usa la risorsa } catch (ExceptionType e) { // Gestione dell'eccezione } Differenze principali: try { … } (classico) try ( … ) { … } (try-with-resources) Serve per gestire eccezioni. Serve per gestire eccezioni e chiudere automaticamente le risorse. Non gestisce la chiusura automatica delle risorse. Le risorse dichiarate nelle parentesi vengono chiuse automaticamente. Richiede un blocco finally se vuoi chiudere risorse manualmente. Non richiede un blocco finally, poiché le risorse vengono chiuse automaticamente. Utilizzato per qualsiasi codice che potrebbe generare eccezioni. Utilizzato per risorse che implementano l'interfaccia AutoCloseable. → Quando usare try-with-resources? Usa try-with-resources ogni volta che lavori con risorse che devono essere chiuse, come: - File (es: BufferedReader, FileInputStream), - Connessioni a database (es: Connection), - Stream (es: InputStream, OutputStream), - Socket (es: Socket). In questo modo, il codice sarà più pulito e gestirà correttamente le risorse senza rischiare perdite di memoria o altre problematiche dovute a risorse non chiuse.