Het mechanisme voor foutafhandeling via try-catch-finally is vanaf het begin van de ontwikkeling van de taal aan Java toegevoegd. Het belangrijkste doel is om gestructureerd foutbeheer te bieden door de werkcode en de foutafhandelingscode van elkaar te scheiden.
Probleem: elk onregelmatig of foutief gedrag leidt tot het genereren van een uitzondering (exception). Zonder try-catch kan deze alleen maar verder omhoog worden doorgegeven in de oproepstack. Met deze aanpak kan de applicatie onverwacht stoppen.
Oplossing — gebruik het try { } catch { } finally { } mechanisme, waarmee te verwachten uitzonderingen kunnen worden afgehandeld en garanties worden aangeboden dat afsluitende acties (zoals het vrijgeven van middelen, sluiten van bestanden, terugdraaien van transacties) worden uitgevoerd.
Voorbeeldcode:
try { FileInputStream fin = new FileInputStream("test.txt"); int data = fin.read(); } catch (IOException e) { System.out.println("Fout bij het werken met het bestand: " + e.getMessage()); } finally { fin.close(); }
Belangrijke kenmerken:
try-blok bevat potentiële foutieve codecatch vangt en behandelt uitzonderingenfinally wordt altijd uitgevoerd, zelfs bij return/exceptionsKan finally worden overgeslagen?
Ja, als er binnen het blok een System.exit() staat, de proces onverwacht is gestopt, of de JVM fysiek is gecrasht.
Kan je try-catch gebruiken zonder finally?
Ja, de finally-blok is niet verplicht. Maar als het nodig is om middelen schoon te maken, wordt het meestal gebruikt. Sinds Java 7 is er try-with-resources.
Wat gebeurt er als er een uitzondering is in finally?
Als er een nieuwe fout in finally optreedt, "overschrijft" dat de originele (als deze niet apart wordt afgehandeld), wat problemen kan maskeren.
try { throw new RuntimeException("fail in try"); } finally { throw new RuntimeException("fail in finally"); } // Eindstacktrace — alleen "fail in finally"
catch(Exception e) {} leeg)throw e; zonder new Exception(e))In een project bevatte de finally-blok code die zelf een IOException kon genereren. Bij een fout in try ging de originele uitzondering volledig verloren, wat de foutdiagnose aanzienlijk bemoeilijkte.
Voordelen:
Nadelen:
In plaats van finally is het team overgestapt op try-with-resources. Elke bron implementeert AutoCloseable, vrijgave verloopt automatisch, uitzonderingen worden gelogd als een eigen fout in de logs.
Voordelen:
Nadelen: