Комментарии (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 — это инструмент для точной типизации поведения, который помогает компилятору лучше анализировать код и предотвращать ошибки. Это делает код безопаснее и понятнее для читателя.