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

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

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

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

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

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

Для чего нужен Nothing в Kotlin

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

Основная идея

Nothing — это тип, который не имеет инстанций. Это означает, что функция с типом возврата Nothing:

  • Никогда не завершится нормально
  • Никогда не вернёт значение
  • Всегда выбросит исключение или будет работать вечно
fun fail(message: String): Nothing {
    throw Exception(message)
}

fun infiniteLoop(): Nothing {
    while (true) {
        println("I will never stop")
    }
}

Случаи использования

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

Most common use case — функции обработки ошибок:

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

// Использование:
val user = findUser(id) ?: fail("User not found")
// После fail() код не продолжится, так что компилятор знает,
// что user не null

Это особенно полезно для исключения null-checks:

val name = input.takeIf { it.isNotBlank() } ?: fail("Name cannot be empty")
// Компилятор знает, что если мы здесь, то name не null

2. Функции, которые не возвращаются

fun exitApp(): Nothing {
    System.exit(0)
}

fun restartApp(): Nothing {
    android.os.Process.killProcess(android.os.Process.myPid())
}

3. Infinite loops

fun startEventLoop(): Nothing {
    while (true) {
        val event = waitForEvent()
        handleEvent(event)
    }
}

Nothing vs Unit vs Any

ТипВозвращаетПримеры
UnitЗавершится без значенияfun log(msg: String): Unit { println(msg) }
AnyЗавершится с значениемБазовый класс для всех типов
NothingНикогда не завершится нормальноВыброс исключения, infinite loop

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

Пример 1: Безопасное доступ к значениям

fun <T> requireNotNull(value: T?): T {
    return value ?: throw NullPointerException("Value must not be null")
}

// В Kotlin это реальная функция из stdlib
val name = requireNotNull(user?.name)
// Если здесь код продолжится, компилятор знает что name != null

Пример 2: Обработка ошибок

fun validateInput(input: String): String {
    return input.takeIf { it.length > 3 }
        ?: fail("Input must be longer than 3 characters")
}

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

val validated = validateInput("hi") // выбросит исключение

Пример 3: Sealed class с Nothing

sealed class Result<out T>
data class Success<T>(val data: T) : Result<T>()
data class Error(val exception: Exception) : Result<Nothing>()

// Error наследует Nothing, что означает он никогда не вернёт успешное значение
val error: Result<Nothing> = Error(Exception("Something went wrong"))

Пример 4: Exhaustive when expressions

sealed class Response<T>
data class Ok<T>(val data: T) : Response<T>()
data class Error(val message: String) : Response<Nothing>()

fun handle(response: Response<String>): String = when (response) {
    is Ok -> response.data
    is Error -> throw Exception(response.message)
}

Почему это важно для типизации

Nothing позволяет компилятору смарт-каставать типы:

val user = getUser() ?: fail("No user")
val name = user.name // не нужна проверка user на null

Реальные примеры из Kotlin stdlib

public inline fun error(message: Any): Nothing =
    throw IllegalStateException(message.toString())

public inline fun TODO(reason: String = ""): Nothing =
    throw NotImplementedError("An operation is not implemented: $reason")

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

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

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