Try-with-resources in Kotlin: So werden Sie finally für immer los

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Warum Java-Programmierer weinen, wenn sie zu Kotlin wechseln?

\n\n

Stellen Sie sich vor: Sie schreiben Code in Java, öffnen eine Datei, lesen Daten und … vergessen, sie zu schließen. Kennen Sie den Schmerz? In Java wurde dafür das Konstrukt try-with-resources entwickelt, das automatisch close() aufruft. Aber wenn Entwickler zu Kotlin wechseln, sind sie oft verwirrt: „Wo ist mein geliebtes try (Resource res = ...)?“.

\n\n

Spoiler: In Kotlin gibt es try-with-resources nicht als eigenständiges Sprachkonstrukt. Und das ist eine gute Nachricht. Stattdessen bietet die Sprache eine elegantere und prägnantere Lösung – die Funktion use. Lassen Sie uns verstehen, wie das funktioniert und warum Ihr Code sauberer wird.

\n\n

Das Problem: Ressourcen müssen geschlossen werden

\n\n

Jede externe Ressource – eine Datei, eine Netzwerkverbindung, eine Datenbank – erfordert manuelle Verwaltung. Wenn Sie einen FileInputStream öffnen und nicht schließen, kann das System „lecken“ (Speicherleck), und die Datei bleibt für andere Prozesse gesperrt.

\n\n

In Java wird dieses Problem auf zwei Arten gelöst:

\n\n
    \n
  • Alte Methode: Der finally-Block mit explizitem Aufruf von close().
  • \n
  • Neue Methode: try-with-resources (eingeführt in Java 7).
  • \n
\n\n

Kotlin geht noch weiter: Es verwendet Erweiterungsfunktionen und Lambdas, um den Code nicht nur sicher, sondern auch schön zu machen.

\n\n

Wie sieht try-with-resources in Java aus?

\n\n

Zum Vergleich schauen wir uns einen klassischen Java-Code an:

\n\n
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {\n    String line = br.readLine();\n    System.out.println(line);\n} catch (IOException e) {\n    e.printStackTrace();\n}\n// br wird automatisch geschlossen\n
\n\n

Das ist gut, aber es gibt Nuancen:

\n
    \n
  • Die Variable muss innerhalb der try-Klammern deklariert werden.
  • \n
  • Es werden nur Klassen unterstützt, die AutoCloseable implementieren.
  • \n
  • Der Code wird umfangreich, wenn mehrere Ressourcen vorhanden sind.
  • \n
\n\n

Der Kotlin-Ansatz: Die Funktion use

\n\n

In Kotlin wird für die sichere Arbeit mit Ressourcen die Funktion use verwendet. Sie ist als Erweiterung für das Interface Closeable (und AutoCloseable für die Kompatibilität mit Java) definiert.

\n\n

So sieht das gleiche Beispiel in Kotlin aus:

\n\n
import java.io.BufferedReader\nimport java.io.FileReader\n\nfun main() {\n    BufferedReader(FileReader("file.txt")).use { reader ->\n        val line = reader.readLine()\n        println(line)\n    }\n    // reader wird automatisch geschlossen\n}\n
\n\n

Sauber, prägnant, ohne überflüssiges try-catch? Nicht ganz. use selbst fängt keine Ausnahmen. Es stellt nur sicher, dass close() am Ende des Blocks aufgerufen wird. Wenn Sie einen Fehler behandeln möchten, fügen Sie ein try-catch außen hinzu:

\n\n
try {\n    BufferedReader(FileReader("file.txt")).use { reader ->\n        val line = reader.readLine()\n        println(line)\n    }\n} catch (e: IOException) {\n    println("Fehler beim Lesen der Datei: ${e.message}")\n}\n
\n\n

Wie funktioniert use unter der Haube?

\n\n

Um die Magie zu verstehen, werfen wir einen Blick in die Kotlin-Quellen. Die Funktion use ist in der Standardbibliothek etwa so definiert:

\n\n
public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R {\n    var exception: Throwable? = null\n    try {\n        return block(this)\n    } catch (e: Throwable) {\n        exception = e\n        throw e\n    } finally {\n        when {\n            exception == null -> close()\n            else -> try {\n                close()\n            } catch (closeException: Throwable) {\n                // Ausnahme unterdrücken, zur Hauptausnahme hinzufügen\n                exception.addSuppressed(closeExcep                

Blogs

Buchempfehlungen