9.2 Ausnahmen weiterleiten, throws am Kopf von Methoden/Konstruktoren
Neben dem »Einzäunen« von problematischen Blöcken durch einen try-Block mit angehängtem catch-Block zur Behandlung gibt es eine weitere Möglichkeit, auf Exceptions zu reagieren: das Weiterleiten an den Aufrufer.
Nicht abgefangene ungeprüfte Ausnahmen gehen automatisch an den Aufrufer weiter, und wenn sie nicht aufgefangen werden, führen sie zum Ende des Threads – falls es nur den main-Thread gibt, beendet die JVM das Programm.
9.2.1 throws bei Konstruktoren und Methoden
Um Ausnahmen an den Aufrufer weiterzureichen, wird im Kopf der betreffenden Methode, oder des Konstruktors, eine throws-Klausel eingeführt. Das zeigt an, dass eine bestimmte Exception von der Methode oder vom Konstruktor nicht behandelt, sondern die Ausnahme an die aufrufende Stelle weitergeben wird. Tritt in der Methode oder dem Konstruktor eine Exception auf, so endet die Abarbeitung, die Ausnahme wird nicht lokal behandelt, sondern der Aufrufer muss sich um die Ausnahme kümmern.
Wir können unsere Methode writeUuid() so umschreiben, dass sie die Ausnahmen nicht mehr selbst abfängt, sondern nach oben weiterleitet:
public class UuidWriter2 {
public static void writeUuid() throws IOException {
String content = UUID.randomUUID() + "\n";
Files.writeString( Path.of( "uuids.txt" ),
content, StandardOpenOption.APPEND );
}
public static void main( String[] args ) {
try {
writeUuid();
}
catch ( IOException e ) { e.printStackTrace(); }
}
}
Nun ist main(…) am Zug und muss sich mit IOException herumärgern. Auch an main(…) könnte ein throws stehen; dann hätte die JVM den schwarzen Peter. Das Weiterleiten nach oben ist nicht unüblich, denn oftmals kann eine Methode oder ein Konstruktor die Ausnahme gar nicht behandeln und so weitermachen, als ob nichts gewesen wäre.
[+] Tipp
Es ist unüblich, ungeprüfte Ausnahmen bei throws mit anzugeben. Allerdings sollten bewusste ungeprüfte Ausnahmen auf jeden Fall in der Javadoc auftauchen.