← Назад к вопросам

Приведи пример функции использующей Nothing

2.0 Middle🔥 61 комментариев
#JVM и память#Kotlin основы

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Пример использования Nothing в Kotlin

В Kotlin Nothing — это специальный тип, который не имеет значений и используется для обозначения ситуаций, которые никогда не завершаются нормально. Функция, возвращающая Nothing, всегда завершается исключением или приводит к бесконечному циклу, никогда не возвращая результат.

Зачем это нужно?

  • Сигнализация невозможности возврата: Явно указывает компилятору и разработчикам, что функция не вернёт управление.
  • Помощь системе типов: Kotlin использует это для улучшения анализа потока данных (smart cast).
  • Унификация обработки ошибок: Часто применяется в функциях-валидаторах или фатальных ошибках.

Ключевой пример: функция fail()

fun fail(message: String): Nothing {
    throw IllegalStateException(message)
}

Эта функция всегда выбрасывает исключение, поэтому её возвращаемый тип — Nothing.

Практическое использование

fun processUser(user: User?) {
    val validUser = user ?: fail("User cannot be null")
    // Здесь компилятор знает, что `validUser` имеет тип User (не null)
    println("Processing ${validUser.name}")
}

fun calculateTax(income: Int): Int {
    return if (income >= 0) {
        income * 20 / 100
    } else {
        fail("Income cannot be negative")
    }
}

В примере с processUser():

  • Если user равен null, вызывается fail(), которая выбрасывает исключение.
  • После проверки user ?: fail(...) компилятор точно знает, что validUser не может быть null, благодаря типу Nothing.

Более сложный пример из реальной практики

sealed class Result<out T> {
    data class Success<T>(val data: T) : Result<T>()
    data class Error(val message: String) : Result<Nothing>()
}

fun handleResult(result: Result<String>) {
    when (result) {
        is Result.Success -> println("Success: ${result.data}")
        is Result.Error -> {
            logError(result.message)
            fail("Operation failed: ${result.message}")
        }
    }
}

fun logError(message: String): Nothing? {
    // Функция логирования, которая может возвращать null,
    // но мы используем Nothing? для совместимости
    println("ERROR: $message")
    return null
}

Важные особенности Nothing:

  1. Подтип всех типов: Nothing является подтипом любого типа в Kotlin, что позволяет использовать его в ковариантных позициях.
  2. Контроль потока выполнения: Компилятор использует информацию о Nothing для улучшенного анализа кода.
  3. Отличие от Unit: Unit означает "нет значимого значения", а Nothing означает "нет значения вообще" (функция не возвращает управление).

Типичные сценарии использования:

  • Функции валидации, которые прерывают выполнение при ошибке
  • Фабрики исключений в библиотеках
  • Функции завершения программы (exitProcess())
  • Бесконечные циклы (например, в серверных приложениях)

Использование Nothing делает код более выразительным и типобезопасным, явно указывая на намерения разработчика и помогая компилятору лучше анализировать код.

Приведи пример функции использующей Nothing | PrepBro