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

Что значит что функция возвращает Nothing?

1.3 Junior🔥 111 комментариев
#Kotlin основы

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

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

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

Что значит, что функция возвращает Nothing в Kotlin?

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

Основные характеристики Nothing

  1. Отсутствие значений: Nothing — это тип, который не имеет никаких значений. Вы не можете создать переменную типа Nothing с каким-либо содержимым.
  2. Подтип всех типов: В системе типов Kotlin Nothing является подтипом (subtype) любого другого типа. Это логично, так если функция никогда не возвращается, то её "возвращаемое значение" можно считать совместимым с любым ожидаемым типом.
  3. Сигнал о невозможности нормального завершения: Использование Nothing в качестве возвращаемого типа явно указывает в контракте функции, что её вызов приведет к исключительной ситуации.

Основные случаи использования

1. Функции, которые всегда выбрасывают исключение

Это наиболее частый и практический пример. Такие функции используются для генерации ошибок, валидации или в тестовых фреймворках.

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

fun exampleUsage(condition: Boolean) {
    val result: String = if (condition) {
        "Success"
    } else {
        failWithMessage("Condition failed") // Тип Nothing совместим с String
    }
    println(result)
}

Здесь failWithMessage объявлена как возвращающая Nothing. При компиляции проверяется, что в ветке else выражение типа Nothing может быть присвоено переменной result типа String, благодаря тому, что Nothing — подтип всего.

2. Функции, которые приводят к завершению программы

Например, стандартная функция error из библиотеки Kotlin.

fun error(message: String): Nothing {
    throw RuntimeException(message)
}

3. Объявление функций, которые не должны завершаться

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

abstract class Validator {
    abstract fun validateAndThrow(): Nothing // Все реализации должны кидать исключение
}

class PositiveNumberValidator : Validator() {
    override fun validateAndThrow(): Nothing {
        // Реализация обязана либо бросить исключение, либо вызвать другую функцию, возвращающую Nothing
        check(value > 0) { "Number must be positive" }
    }
}

4. Использование в комбинации с Элвис оператором (?:)

Nothing особенно полезен в ситуациях, требующих обязательного значения или действия.

val userInput: String? = getUserInput()
val mandatoryInput: String = userInput ?: error("Input cannot be null")
// Если userInput null, вызовется error (возвращает Nothing), и присвоение не произойдет

Nothing vs Unit vs Void

  • Unit: Аналог void в Java. Обозначает, что функция возвращается нормально, но без полезного значения. Unit — это singleton тип с одним значением.
  • Void (Java): В Kotlin не используется напрямую. Обозначает отсутствие возвращаемого значения.
  • Nothing: Обозначает, что функция не возвращается вообще (в нормальном смысле). Это фундаментальное отличие.
fun returnsUnit(): Unit {
    println("This returns normally")
    // Возвращает объект Unit, можно явно написать `return Unit`
}

fun returnsNothing(): Nothing {
    throw Exception("This never returns")
    // Нет нормального пути выполнения до конца функции
}

Nothing? — nullable вариант

Существует также тип Nothing?, который имеет единственное возможное значение — null. Это может использоваться в некоторых специфических случаях в обобщённых (generic) API или для выражения "отсутствия даже исключения", но на практике встречается гораздо реже.

Итог

Тип Nothing в Kotlin — это мощный инструмент для:

  • Явного документирования поведения функции в её контракте (сигнатуре).
  • Улучшения безопасности типов — компилятор знает, что после вызова такой функции выполнение не продолжается.
  • Создания более чистого и выразительного кода, особенно в сочетании с операторами контроля потока (if, when, элвис-оператор).

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

Что значит что функция возвращает Nothing? | PrepBro