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

Какие знаешь примеры стандартной функции возвращающей Nothing?

2.0 Middle🔥 81 комментариев
#Kotlin основы

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

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

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

Примеры функций, возвращающих Nothing в Kotlin

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

Ниже приведены ключевые примеры стандартных функций, возвращающих Nothing.

1. throw IllegalStateException() и аналоги

Любая функция, которая явно выбрасывает исключение, может иметь возвращаемый тип Nothing, поскольку она не возвращает управление. В стандартной библиотеке это часто используется в функциях-помощниках.

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

// Использование
fun process(value: Int) {
    if (value < 0) {
        fail("Invalid value: $value") // Тип Nothing, компилятор знает, что дальше код не выполнится
    }
    println("Processing $value") // Этот код не выполнится, если value < 0
}

2. error() из стандартной библиотеки

Функция error() — это встроенная функция в Kotlin, которая выбрасывает IllegalStateException и возвращает Nothing. Она часто используется для обработки ошибок в коде.

import kotlin.error

fun getUserName(id: Int): String {
    return if (id > 0) "User$id" else error("Invalid ID")
    // После error() компилятор понимает, что возврата String не произойдет
}

3. TODO() — функция для заглушек

TODO() — одна из самых известных функций, возвращающих Nothing. Она выбрасывает NotImplementedError и используется как заглушка для ещё не реализованного кода. Компилятор не требует возвращать значение после TODO(), что удобно при прототипировании.

fun calculateTax(income: Double): Double {
    TODO("Tax calculation logic to be implemented")
    // Компилятор не требует возврата Double, так как TODO() возвращает Nothing
}

При вызове TODO() происходит следующее:

fun example() {
    val result = TODO() // Выбрасывает NotImplementedError
    println("Этот код никогда не выполнится") // Недостижимый код
}

4. require() и check() с лямбдами

Функции require() и check() используются для проверки условий (пре- и постусловий). Если условие ложно, они выбрасывают IllegalArgumentException или IllegalStateException соответственно. Их версии с лямбдами возвращают Nothing при сбое.

fun divide(a: Int, b: Int): Int {
    require(b != 0) { "Divider cannot be zero" } // Если b == 0, выбрасывает исключение, тип возврата — Nothing
    return a / b
}

5. Собственные функции с бесконечными циклами

Функции, которые никогда не завершаются (например, содержат бесконечный цикл), также могут возвращать Nothing. Это полезно для обработки событий или потоков данных, которые работают постоянно.

fun runForever(): Nothing {
    while (true) {
        // Бесконечная обработка событий
        Thread.sleep(1000)
    }
    // Нет возврата, но компилятор понимает это через тип Nothing
}

6. exitProcess() из kotlin.system

Функция exitProcess() завершает выполнение программы и возвращает Nothing, так как после её вызова процесс прекращается.

import kotlin.system.exitProcess

fun shutdownOnError(error: Throwable): Nothing {
    println("Fatal error: $error")
    exitProcess(1) // Возвращает Nothing, программа завершается
}

Практическая польза Nothing

  • Типобезопасность в ветвлениях: Компилятор Kotlin использует Nothing для умного приведения типов (smart casting). Например, в выражении if/else, если одна ветвь возвращает Nothing, компилятор знает, что возвращаемый тип — это тип из другой ветви.
fun getValueOrFail(flag: Boolean): String {
    return if (flag) "Success" else fail("Failed") 
    // Тип результата — String, так как fail() возвращает Nothing
}
  • Отсутствие null: Nothing — это подтип всех типов (включая nullable), но сам он не может иметь значений. Это отличает его от Unit (который имеет одно значение) и Any? (который может быть null).

Ключевые выводы

  • Nothing представляет "отсутствие значения" и используется для функций, которые никогда не завершаются нормально.
  • Стандартные примеры: TODO(), error(), throw, require()/check() с лямбдами, exitProcess().
  • Это мощный инструмент для статического анализа кода, помогающий компилятору оптимизировать проверки и обеспечивать безопасность типов.

Таким образом, Nothing — это не просто техническая деталь, а важная часть системы типов Kotlin, которая способствует написанию надёжного и выразительного кода.

Какие знаешь примеры стандартной функции возвращающей Nothing? | PrepBro