En Kotlin, la gestion des exceptions est réalisée à l'aide de la structure try/catch/finally, mais elle diffère de l'approche de Java par son accent sur les exceptions non vérifiées (Unchecked Exceptions) et un syntaxe plus concise. Une différence importante est qu'en Kotlin, il n'y a pas d'exceptions vérifiées (checked exceptions), ce qui libère le programmeur de l'obligation de spécifier throws et de capturer de telles exceptions.
Java utilise des exceptions vérifiées et non vérifiées, où les vérifiées nécessitent une capture explicite ou une déclaration. Cela conduit souvent à un code prolixe et peu pratique. Kotlin a été conçu pour être plus simple : toutes les exceptions sont généralement non vérifiées (héritées de RuntimeException), ce qui facilite la gestion et rend le code plus lisible.
Les développeurs Java essayant de capturer et de spécifier des exceptions vérifiées en Kotlin — le code se compile, mais le sens est perdu. De plus, l'utilisation de finally sans comprendre les nuances peut provoquer des fuites ou du code non fonctionnel.
Utilisons try/catch/finally en Kotlin de manière concise et pertinente :
fun process(data: String): Int = try { data.toInt() } catch (e: NumberFormatException) { 0 } finally { println("Traitement terminé") }
Caractéristiques clés :
Que se passe-t-il si une exception est levée dans le bloc finally ? Comment cela influence-t-il le retour de la valeur ?
Les exceptions levées depuis finally écrasent toujours toute autre exception ou retour du bloc try/catch, ce qui peut entraîner la perte d'informations importantes sur la cause de l'échec.
fun demo(): Int = try { 1 } finally { throw RuntimeException("erreur dans finally") }
Le try/catch peut-il être une expression en Kotlin ? Quelle est la différence avec Java ?
Oui. try/catch/finally en Kotlin est une expression, donc ils peuvent retourner un résultat et être utilisés dans des contextes où des valeurs sont autorisées.
val value = try { risky() } catch (e: Exception) { fallback() }
En Java, ce ne sont que des instructions.
Est-il nécessaire de capturer les exceptions en Kotlin si une fonction Java externe est appelée avec throws ?
Non. Étant donné que les exceptions vérifiées sont ignorées par le compilateur Kotlin : il n'est pas nécessaire de les capturer explicitement, mais elles peuvent toujours être lancées pendant l'exécution.
Ils insèrent catch (e: Exception) partout, sans différencier les erreurs réelles et attendues. Ils utilisent finally pour retourner une valeur, ce qui conduit à un comportement inattendu en cas d'erreurs.
Avantages :
Inconvénients :
Ils ne capturent que les erreurs attendues, utilisent finally uniquement pour le nettoyage des ressources, et emploient try/catch comme des expressions là où cela améliore la lisibilité.
Avantages :
Inconvénients :