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

Для чего нужен Nothing?

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

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

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

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

Nothing в Kotlin — невозможный тип

Nothing — это специальный тип в системе типов Kotlin, который представляет "отсутствие значения" в самом крайнем смысле. Nothing не имеет экземпляров и используется в очень специфических ситуациях.

Основное определение

Nothing — это подтип всех типов в Kotlin. Это значит, что значение типа Nothing можно присвоить переменной любого другого типа:

val x: String = TODO()  // Nothing приводится к String
val y: Int = TODO()      // Nothing приводится к Int

Основные применения Nothing

1. Функции, которые никогда не возвращают результат

Функция может завершиться одним из способов:

  • Вернуть значение
  • Выбросить исключение
  • Зависнуть в бесконечном цикле

Для последних двух случаев используется Nothing:

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

val x = if (condition) "OK" else fail("Not OK")
// x имеет тип String, потому что fail() возвращает Nothing

2. TODO() — заглушки в разработке

fun calculatePrice(product: Product): Double {
    TODO("Implement price calculation")
}

val price: Double = calculatePrice(product)  // Компилируется!

Компилятор не ругается, потому что TODO() возвращает Nothing, который может быть присвоен Double.

3. Функции с бесконечными циклами

fun processRequests(): Nothing {
    while (true) {
        val request = readRequest()
        handleRequest(request)
    }
}

4. Контроль потока выполнения

Nothing помогает компилятору анализировать недостижимый код:

when (status) {
    "success" -> println("OK")
    "error" -> throw Exception()
    else -> fail("Unknown status")  // Nothing сигнализирует, что здесь выполнение не продолжится
}

// Код ниже доступен только в веткe "success"

Сравнение с Void и Unit

Void (Java) используется для методов, которые ничего не возвращают:

fun printMessage(msg: String): Unit {  // или просто без типа
    println(msg)
    // Функция завершает выполнение нормально, но ничего не возвращает
}

Unit это реальный тип с единственным значением Unit (как void в Java). Unit — это нормальное завершение функции.

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

Практические примеры

Расширение для assert

inline fun assert(value: Boolean, message: String): Nothing? {
    if (!value) {
        throw AssertionError(message)
    }
    return null  // Никогда не выполнится
}

Вспомогательная функция для выброса исключений

fun <T> exhaustive(x: T): Nothing {
    throw AssertionError("Not exhaustive: $x")
}

when (color) {
    Color.RED -> handleRed()
    Color.BLUE -> handleBlue()
    Color.GREEN -> handleGreen()
    else -> exhaustive(color)  // Компилятор гарантирует, что это недостижимо
}

Ключевые моменты

  • Nothing — пустой тип без инстанций
  • Используется для типизации функций, которые не возвращают нормально
  • Помогает компилятору анализировать недостижимый код
  • В 99% случаев вы будете видеть Nothing только в сигнатурах функций
  • Практическая ценность — документирование поведения и помощь компилятору

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

Для чего нужен Nothing? | PrepBro