In Kotlin wordt exception handling gerealiseerd met de try/catch/finally constructie, maar het verschilt van de Java-aanpak door de focus op Unchecked Exceptions en de elegantere syntaxis. Een belangrijk onderscheid is dat Kotlin geen checked exceptions heeft, wat de programmeur ontlast van de noodzaak om throws op te geven en dergelijke exceptions te vangen.
Java gebruikt checked/unchecked exceptions, waarbij checked expliciet moeten worden opgevangen of gedeclareerd. Dit leidt vaak tot overbodige boilerplatecode en onhandige code. Kotlin is eenvoudiger ontworpen: alle exceptions zijn over het algemeen unchecked (overgeërfd van RuntimeException), wat de verwerking vergemakkelijkt en de code leesbaarder maakt.
Java-ontwikkelaars proberen in Kotlin checked exceptions op te vangen en aan te geven — de code compileert, maar de betekenis gaat verloren. Bovendien leidt het gebruik van finally zonder bewustzijn van nuances tot lekkages of niet-werkende code.
Gebruik try/catch/finally in Kotlin kort en krachtig:
fun process(data: String): Int = try { data.toInt() } catch (e: NumberFormatException) { 0 } finally { println("Processing done") }
Belangrijke kenmerken:
Wat gebeurt er als er een exception wordt gegooid in de finally-blok? Hoe beïnvloedt dit de returnwaarde?
Exceptions die uit finally worden gegooid, overschrijven altijd andere exceptions of returns uit de try/catch-blok, wat kan leiden tot het verlies van belangrijke gegevens over de oorzaak van de crash.
fun demo(): Int = try { 1 } finally { throw RuntimeException("error in finally") }
Kan try/catch een expressie zijn in Kotlin? Wat is het verschil met Java?
Ja. try/catch/finally in Kotlin zijn expressies, dus ze kunnen een resultaat retourneren en gebruikt worden op plaatsen waar waarden zijn toegestaan.
val value = try { risky() } catch (e: Exception) { fallback() }
In Java zijn dit alleen operators.
Is het verplicht om exceptions te vangen in Kotlin als er een externe Java-functie met throws wordt aangeroepen?
Nee. Aangezien checked exceptions door de Kotlin-compiler worden genegeerd: ze hoeven niet expliciet te worden gevangen, maar kunnen nog steeds tijdens uitvoering worden gegooid.
Plaatsen catch (e: Exception) overal zonder onderscheid te maken tussen echte en verwachte fouten. Gebruik finally voor het retourneren van waarden, wat leidt tot onverwacht gedrag bij fouten.
Voordelen:
Nadelen:
Vangen alleen verwachte fouten, finally alleen voor het opruimen van resources, en gebruiken try/catch als expressies waar dit de leesbaarheid verhoogt.
Voordelen:
Nadelen: