EMZETT.
Login

Kurz: In Kotlin gibt es keine geprüften Exceptions: Du musst Fehler nicht deklarieren oder zwingend abfangen. try ist ein Ausdruck.

Teil des Kurses Kotlin

Kapitel 11 von 13 im Kurs Kotlin. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

Exceptions

In Kotlin gibt es keine geprüften Exceptions: Du musst Fehler nicht deklarieren oder zwingend abfangen. try ist ein Ausdruck.

class MeinFehler(msg: String) : Exception(msg)
 
fun parse(s: String): Int = try {
    s.toInt()
} catch (e: NumberFormatException) {
    -1
} finally {
    println("geprüft: $s")
}
 
fun main() {
    println(parse("42"))
    println(parse("x"))
    try {
        throw MeinFehler("eigener Fehler")
    } catch (e: MeinFehler) {
        println("${e.javaClass.simpleName}: ${e.message}")
    }
    try {
        val l = listOf(1)
        println(l[5])
    } catch (e: IndexOutOfBoundsException) {
        println("Index ungültig")
    } catch (e: Exception) {
        println("anderes")
    }
    val ergebnis = try { 1 / 0 } catch (e: ArithmeticException) { 0 }
    println(ergebnis)
}

Ausgabe:

geprüft: 42
42
geprüft: x
-1
MeinFehler: eigener Fehler
Index ungültig
0

Ressourcen und Dateien

use schließt Ressourcen automatisch (wie try-with-resources):

import java.io.File
 
fun main() {
    val datei = File.createTempFile("demo", ".txt")
    datei.writeText("Zeile 1\nZeile 2\nZeile 3\n")
    datei.appendText("Zeile 4\n")
    println(datei.readText().length)
    println(datei.readLines())
    datei.bufferedReader().use { r ->
        println(r.readLine())
    }
    datei.forEachLine { print("[${it.length}]") }
    println()
    println(datei.readLines().map { it.split(" ")[1].toInt() }.sum())
    println(datei.exists())
    datei.delete()
    println(datei.exists())
}

Ausgabe:

32
[Zeile 1, Zeile 2, Zeile 3, Zeile 4]
Zeile 1
[7][7][7][7]
10
true
false

Mit Java zusammenarbeiten

Kotlin nutzt alle Java-Bibliotheken direkt und umgekehrt:

import java.util.ArrayList
import java.util.Collections
import java.time.LocalDate
import java.util.concurrent.atomic.AtomicInteger
 
fun main() {
    val liste = ArrayList<Int>()
    liste.addAll(listOf(3, 1, 2))
    Collections.sort(liste)
    println(liste)
 
    val datum = LocalDate.of(2025, 3, 15)
    println(datum.plusDays(20))
    println(datum.dayOfWeek)
 
    val zaehler = AtomicInteger()
    val threads = (1..4).map { Thread { repeat(1000) { zaehler.incrementAndGet() } } }
    threads.forEach { it.start() }
    threads.forEach { it.join() }
    println(zaehler.get())
 
    val sb = java.lang.StringBuilder("abc").reverse()
    println(sb)
}

Ausgabe:

[1, 2, 3]
2025-04-04
SATURDAY
4000
cba

Weitere Hinweise zur Zusammenarbeit:

  • @JvmStatic, @JvmField, @JvmOverloads formen Kotlin-Code für Java-Aufrufer
  • Java-Typen ohne Nullbarkeits-Angabe heißen Plattformtypen (String!): hier prüft Kotlin nicht, also vorsichtig sein
  • Java-Getter/Setter erscheinen als Eigenschaften (obj.name statt obj.getName())

Merke

  • Keine geprüften Exceptions, try ist ein Ausdruck
  • use schließt Ressourcen automatisch
  • File.readText, readLines, writeText, appendText für Dateien
  • Alle Java-Bibliotheken sind direkt nutzbar

Übungsaufgabe

Schreibe Zeilen in eine temporäre Datei, lies sie wieder ein und zähle die Wörter.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: Scope-Funktionen, DSLs und Idiome

Weiter: Coroutinen, Android und Ökosystem

Alle Kapitel: Kotlin im Überblick