Что изменилось в обработке ошибок в Kotlin, если сравнить с Java?android-249

1. Отсутствие checked exceptions

Java:

// Обязательно обработать или пробросить
public void readFile() throws IOException {
    Files.readAllBytes(Paths.get("file.txt"));
}

Kotlin:

fun readFile() {
    Files.readBytes(Paths.get("file.txt")) // Не требует объявления throws
}

Что изменилось:

  • Kotlin полностью отказался от checked exceptions
  • Разработчик сам решает, когда обрабатывать ошибки
  • Уменьшение шаблонного кода, но требует большей дисциплины

2. Try как выражение

Kotlin:

val result = try {
    "123".toInt()
} catch (e: NumberFormatException) {
    null
}

Преимущества:

  • Возможность возвращать значение из блока try/catch
  • Более функциональный стиль программирования

3. Встроенные функции для безопасных операций

Kotlin предоставляет стандартные функции:

val number = "123".toIntOrNull() // Возвращает null вместо исключения

val length = nullableString?.length ?: 0 // Elvis-оператор

Аналоги в Java:

Integer number = null;
try {
    number = Integer.parseInt("123");
} catch (NumberFormatException e) {
    // Обработка
}

4. Result тип для функционального подхода

Kotlin 1.3+:

fun parseNumber(text: String): Result<Int> = runCatching {
    text.toInt()
}

// Использование:
parseNumber("123")
    .onSuccess { println(it) }
    .onFailure { println("Error: ${it.message}") }

Особенности:

  • Альтернатива традиционным исключениям
  • Позволяет явно выразить возможность ошибки в типе
  • Легко комбинируется с другими функциями высшего порядка

5. Секция when для обработки исключений

Идиоматичный Kotlin:

fun handleError(e: Exception) = when(e) {
    is IOException -> println("IO error")
    is IllegalArgumentException -> println("Invalid argument")
    else -> throw e // Переброс непредвиденных исключений
}

6. Лучшая интеграция с корутинами

Kotlin:

viewModelScope.launch {
    val result = try {
        repository.loadData()
    } catch (e: Exception) {
        ErrorState(e.message)
    }
    _state.value = result
}

Преимущества:

  • Единый подход к синхронным и асинхронным ошибкам
  • Простота обработки в цепочках вызовов

Когда Java подход лучше?

  1. Строгая дисциплина: checked exceptions вынуждают обрабатывать ошибки
  2. Легаси-код: интеграция с Java библиотеками
  3. Корпоративные стандарты: где требуется явное объявление исключений

Резюмируем:

Kotlin предлагает более гибкую систему обработки ошибок с акцентом на null-безопасность, функциональные подходы (Result тип) и уменьшение шаблонного кода. Однако это требует от разработчика большей сознательности при проектировании обработки ошибок по сравнению с Java.