studyklar
GdI 2 · Probeklausur Teil 2 · Aufgabe 9

IOException mit throws weiterreichen und in testMethode behandeln

Wer in eine Datei schreibt, muss mit Fehlern rechnen, etwa wenn die Datei gesperrt ist. Java zwingt uns, solche Fehler zu behandeln. Hier geschieht das nicht dort, wo der Fehler entsteht, sondern eine Ebene höher. Rechts steht die Kette der Aufrufe und der geänderte Code. Mit Weiter geht es Schritt für Schritt voran.

Die Aufgabe

Aufgabe 9

Gegeben sind die folgenden Methoden:

public static void schreibeInDatei() {    Files.writeString(Path.of("Datei1"), "Das ist der Inhalt");} public static void testMethode() {    schreibeInDatei();}

Der Code ist fehlerhaft, da „Files.writeString“ im Fehlerfall eine „IOException“ wirft. Dabei handelt es sich um eine CheckedException, die behandelt werden muss. Diese Behandlung soll allerdings nicht in der Methode „schreibeInDatei“ erfolgen, sondern in der Methode „testMethode“.

Ändern Sie die angegebenen Methoden so, dass die IOException an „testMethode“ weitergereicht und in der testMethode behandelt wird. Beim Auftreten der Exception soll deren Message ausgegeben werden.

Gegeben sind zwei Methoden, die sich so nicht übersetzen lassen. Gesucht sind die geänderten Methoden: schreibeInDatei soll die IOException nur weiterreichen, testMethode soll sie behandeln und ihre Meldung ausgeben.

Merke: Eine Checked Exception (geprüfte Ausnahme) wie IOException muss behandelt werden, sonst übersetzt der Compiler den Code nicht. Eine Methode hat zwei Möglichkeiten: Sie fängt die Exception mit try-catch, oder sie reicht sie mit throws im Methodenkopf an ihren Aufrufer weiter. Dann muss sich der Aufrufer darum kümmern.
  1. Verstehen, warum der gegebene Code nicht übersetzt.
  2. schreibeInDatei reicht die IOException mit throws weiter.
  3. testMethode fängt sie mit try-catch und gibt die Meldung aus.
  4. Probelauf mit und ohne Fehler.

Zu dieser Probeklausur gibt es keine Musterlösung. Die Lösung hier ist selbst erarbeitet und in einem kleinen Programm übersetzt und ausgeführt.

Warum der gegebene Code nicht übersetzt

public static void schreibeInDatei() {    Files.writeString(Path.of("Datei1"), "Das ist der Inhalt");} public static void testMethode() {    schreibeInDatei();}

Der Compiler meldet in Zeile 2:

Nicht gemeldete Ausnahme IOException. Muss abgefangen oder deklariert werden, um ausgelöst zu werden

Files.writeString(Path.of("Datei1"), …) schreibt den Text in die Datei „Datei1“. Das kann scheitern, etwa wenn die Datei schreibgeschützt ist. Für diesen Fall ist die Methode mit throws IOException gekennzeichnet.

Weil die IOException eine Checked Exception ist, prüft der Compiler: Fängt schreibeInDatei sie, oder reicht es sie weiter? Weder noch. Darum meldet er beim Übersetzen einen Fehler, noch bevor das Programm läuft.

schreibeInDatei reicht die IOException mit throws weiter

public static void schreibeInDatei() throws IOException {    Files.writeString(Path.of("Datei1"), "Das ist der Inhalt");}

Die Behandlung soll nicht in schreibeInDatei stattfinden. Also wählt diese Methode die zweite Möglichkeit: Sie deklariert die Exception. Dazu kommt throws IOException in den Methodenkopf, hinter die runden Klammern.

Das heißt: „Diese Methode kann eine IOException werfen; wer sie aufruft, muss damit rechnen.“ Die Zeile mit Files.writeString bleibt unverändert.

Jetzt übersetzt schreibeInDatei. Der Compiler meldet denselben Fehler aber in testMethode, an der Zeile schreibeInDatei();. Die Pflicht ist eine Ebene nach oben gewandert.

Noch 3 Schritte bis zum Ergebnis
Den ganzen Lösungsweg sehen Studierende und Lehrende der HS KL. Registriere dich mit deiner Adresse @stud.hs-kl.de oder @hs-kl.de, dann geht es hier direkt weiter.

Die Kette der Aufrufe

wer ruft wen, wer fängt

Abbildung 1Die Kette der Aufrufe

wer ruft wen, wer fängt

testMethode()try … catch (IOException e): Message ausgeben
schreibeInDatei()throws IOException: reicht weiter
Files.writeString(…)wirft im Fehlerfall eine IOException
LegendeOben die aufrufende Methode, unten die Methode, in der der Fehler entsteht.

Abbildung 1Die Kette der Aufrufe

wer ruft wen, wer fängt

public static void schreibeInDatei() throws IOException {    Files.writeString(Path.of("Datei1"), "Das ist der Inhalt");} public static void testMethode() {    try {        schreibeInDatei();    } catch (IOException e) {        System.out.println(e.getMessage());    }}