Il meccanismo di gestione delle eccezioni tramite try-catch-finally è stato introdotto in Java sin dall'inizio dello sviluppo del linguaggio. L'obiettivo principale è fornire una gestione strutturata degli errori, separando il codice di lavoro e il codice di gestione degli errori.
Problema: qualsiasi comportamento non standard o errato porta a un'eccezione (exception). Senza try-catch, può essere solo inoltrata più in alto nello stack delle chiamate. Con questo approccio, il programma può terminare in modo anomalo.
La soluzione è utilizzare try { } catch { } finally { }, che consente di gestire le eccezioni previste e di eseguire garantito le azioni finali (rilascio delle risorse, chiusura dei file, rollback delle transazioni).
Esempio di codice:
try { FileInputStream fin = new FileInputStream("test.txt"); int data = fin.read(); } catch (IOException e) { System.out.println("Errore durante la gestione del file: " + e.getMessage()); } finally { fin.close(); }
Caratteristiche chiave:
try contiene codice potenzialmente erratocatch intercetta e gestisce le eccezionifinally viene sempre eseguito, anche in caso di return/eccezioneIl finally può non essere eseguito?
Sì, se all'interno del blocco c'è System.exit(), il processo è terminato in modo anomalo, oppure la JVM è "caduta" fisicamente.
È possibile utilizzare try-catch senza finally?
Sì, il blocco finally non è obbligatorio. Ma se è necessario liberare risorse, di solito viene utilizzato. Con Java 7 esiste try-with-resources.
Cosa succede se in finally c'è un'eccezione?
Se in finally si verifica un nuovo errore, esso "sopprimerà" l'originale (se non viene intercettato separatamente), il che può nascondere problemi.
try { throw new RuntimeException("fail in try"); } finally { throw new RuntimeException("fail in finally"); } // Stacktrace finale - solo "fail in finally"
catch(Exception e) {} vuoto)throw e; senza new Exception(e))Nel progetto il blocco finally conteneva codice che poteva a sua volta sollevare IOException. In caso di errore nel try, l'eccezione originale si perdeva completamente, rendendo molto difficile la diagnosi degli errori.
Pro:
Contro:
Invece di finally, il team è passato a try-with-resources. Ogni risorsa implementa AutoCloseable, il rilascio avviene automaticamente, le eccezioni vengono registrate nei log come errori propri.
Pro:
Contro: