В Kotlin обработка исключений реализована с помощью конструкции try/catch/finally, но отличается от подхода Java упором наUnchecked Exceptions и лаковым синтаксисом. Важное отличие — в Kotlin отсутствуют checked exceptions, что разгружает программиста от обязательного указания throws и перехвата таких исключений.
Java использует checked/unchecked exceptions, где checked требуют явного перехвата или объявления. Это часто приводит к избыточному бойлерплейту и неудобному коду. Kotlin задуман проще — все исключения, как правило, являются unchecked (унаследованные от RuntimeException), облегчая обработку и делая код более читаемым.
Java-разработчики в Kotlin пытаются перехватывать и указывать checked exceptions — код компилируется, но смысл теряется. Кроме того, использование finally без осознания нюансов приводит к утечкам или неработающему коду.
Используем try/catch/finally в Kotlin кратко и по делу:
fun process(data: String): Int = try { data.toInt() } catch (e: NumberFormatException) { 0 } finally { println("Processing done") }
Ключевые особенности:
Что происходит, если исключение выброшено в блоке finally? Как это влияет на возврат значения?
Исключения, выброшенные из finally, всегда перекрывают любые другие исключения или return из блока try/catch, что может привести к потере важных данных о причине аварии.
fun demo(): Int = try { 1 } finally { throw RuntimeException("error in finally") }
Может ли try/catch быть выражением в Kotlin? В чем отличие от Java?
Да. try/catch/finally в Kotlin — это выражения, поэтому могут возвращать результат и быть использованы в местах, где допустимы значения.
val value = try { risky() } catch (e: Exception) { fallback() }
В Java это только операторы.
Обязательно ли перехватывать исключения в Kotlin, если вызывается сторонняя Java-функция с throws?
Нет. Так как checked exceptions игнорируются компилятором Kotlin: можно не перехватывать их явно, но они все равно могут быть брошены во время исполнения.
Вставляют catch (e: Exception) везде, не дифференцируя реальные и ожидаемые ошибки. Используют finally для возврата значения, что ведет к неожиданному поведению при ошибках.
Плюсы:
Минусы:
Используют перехват только ожидаемых ошибок, finally только для чистки ресурсов, а try/catch употребляют как выражения там, где это повышает читабельность.
Плюсы:
Минусы: