Java throw vs throws: Exception Handling meesteren met praktische voorbeelden
Java throw vs throws: Exception Handling meesteren met praktische voorbeelden
Deze gids legt uit hoe je Java's throw en throws sleutelwoorden gebruikt voor effectieve exception handling, geïllustreerd met real-world code samples.
In Java vallen exceptions in twee categorieën:
- Unchecked Exceptions – niet geverifieerd tijdens compile-time maar tijdens runtime. Voorbeelden:
ArithmeticException,NullPointerException,ArrayIndexOutOfBoundsException, en alle subklassen vanError. - Checked Exceptions – afgedwongen door de compiler. Voorbeelden:
IOException,InterruptedException, en vele anderen.
Voor een diepere duik, zie Java Exceptions.
Unchecked exceptions signaleren meestal programmeerfouten; ze moeten gecorrigeerd worden in plaats van gevangen. Checked exceptions vertegenwoordigen condities waar aanroepers zich bewust van moeten zijn en moeten afhandelen.
Het throws sleutelwoord gebruiken
Het throws clause declareert dat een methode een of meer exceptions kan gooien, wat de verantwoordelijkheid delegeert aan aanroepers. De syntax is:
accessModifier returnType methodNaam() throws ExceptionType1, ExceptionType2 { /* code */ }
Je kunt meerdere exception typen opnoemen, gescheiden door komma's.
Voorbeeld 1: Een checked exception declareren
import java.io.*; class Main { public static void vindBestand() throws IOException { // Code die IOException kan triggeren File nieuwBestand = new File("test.txt"); FileInputStream stream = new FileInputStream(nieuwBestand); } public static void main(String[] args) { try { vindBestand(); } catch (IOException e) { System.out.println(e); } } }
Uitvoer
java.io.FileNotFoundException: test.txt (Geen dergelijk bestand of map)
Als test.txt ontbreekt, gooit FileInputStream een FileNotFoundException, wat een subklasse is van IOException. Omdat vindBestand() throws IOException declareert, moet de main() methode het afhandelen of propageren.
Meerdere exceptions gooien
Je kunt meerdere exception typen in een enkel throws clause declareren:
import java.io.*; class Main { public static void vindBestand() throws NullPointerException, IOException, InvalidClassException { // Potentieel gooit NullPointerException … // Potentieel gooit IOException … // Potentieel gooit InvalidClassException … } public static void main(String[] args) { try { vindBestand(); } catch (IOException e1) { System.out.println(e1.getMessage()); } catch (InvalidClassException e2) { System.out.println(e2.getMessage()); } } }
Let op dat NullPointerException unchecked is, dus het hoeft niet gevangen of gedeclareerd te worden door de aanroeper.
Wanneer throws vs. try...catch gebruiken
Het inbedden van try...catch in elke methode die een exception kan gooien, kan code vervuilen en logica verduisteren. Het declareren van throws houdt de methode-handtekening schoon en laat hogere-level code beslissen hoe fouten afgehandeld worden.
Het throw sleutelwoord gebruiken
Het throw statement gooit expliciet een exception instantie, wat controle overdraagt aan de dichtstbijzijnde matchende catch blok of het programma termineert als ongehandeld.
Syntax:
throw throwableObject;
Hier is throwableObject een instantie van Throwable of een van zijn subklassen.
Voorbeeld 2: Een unchecked exception gooien
class Main { public static void delenDoorNul() { throw new ArithmeticException("Proberen te delen door 0"); } public static void main(String[] args) { delenDoorNul(); } }
Uitvoer
Exception in thread "main" java.lang.ArithmeticException: Proberen te delen door 0 at Main.delenDoorNul(Main.java:3) at Main.main(Main.java:7) exit status 1
Omdat ArithmeticException unchecked is, is vangen optioneel.
Voorbeeld 3: Een checked exception gooien
import java.io.*; class Main { public static void vindBestand() throws IOException { throw new IOException("Bestand niet gevonden"); } public static void main(String[] args) { try { vindBestand(); System.out.println("Rest van code in try blok"); } catch (IOException e) { System.out.println(e.getMessage()); } } }
Uitvoer
Bestand niet gevonden
Hier gooit vindBestand() een checked IOException, dus aanroepers moeten het afhandelen of declareren. De main() methode demonstreert het vangen van de exception, wat programma-terminatie voorkomt.
Java
- Java-variabelen en literals: een uitgebreide gids
- Java Input & Output beheersen: printen, lezen en formatteren
- Java Expressies, Statements en Blokken begrijpen
- Java klassen en objecten: een praktische gids
- Java abstracte klassen en methoden: een uitgebreide gids
- Java geneste en inner classes meesteren: typen, voorbeelden en best practices
- Multi-exception handling in Java meesteren
- Java Autoboxing en Unboxing: Praktische voorbeelden en best practices
- Java String Vervanging beheersen: replace(), replaceAll() en replaceFirst() uitgelegd
- Java String toLowerCase() & toUpperCase(): Tekstcase Converteren met Locale Awareness
- Java Onder de Knie: Objects, Classes en Kern OOP Concepten