Какие знаешь исключения в Kotlin?
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Исключения в Kotlin: полный обзор
В Kotlin система исключений полностью совместима с Java, но при этом обладает дополнительными возможностями и идиоматическими особенностями. Все исключения наследуются от базового класса Throwable, который разделяется на два основных подкласса: Exception (для исключительных ситуаций, которые можно обработать) и Error (для критических ошибок, которые обычно не обрабатываются).
Основная иерархия исключений
Throwable
├── Exception
│ ├── RuntimeException (непроверяемые исключения)
│ │ ├── NullPointerException
│ │ ├── IllegalArgumentException
│ │ ├── IllegalStateException
│ │ ├── IndexOutOfBoundsException
│ │ └── UnsupportedOperationException
│ └── IOException (проверяемые исключения)
│ ├── FileNotFoundException
│ └── EOFException
└── Error
├── OutOfMemoryError
├── StackOverflowError
└── NoClassDefFoundError
Ключевые особенности обработки исключений в Kotlin
1. Отсутствие проверяемых исключений
В отличие от Java, Kotlin не имеет проверяемых исключений (checked exceptions). Это означает, что компилятор не требует объявлять исключения в сигнатуре метода с помощью throws.
// В Kotlin не нужно объявлять throws
fun readFile(fileName: String): String {
return File(fileName).readText()
}
// В Java эквивалент потребовал бы throws IOException
2. Выражение try-catch как выражение
Одной из самых мощных возможностей Kotlin является то, что try-catch может возвращать значение:
val number = try {
"123".toInt()
} catch (e: NumberFormatException) {
0 // значение по умолчанию
}
println(number) // Выведет: 123
3. Оператор throw как выражение
throw также является выражением и может использоваться в различных контекстах:
val result = if (value > 0) {
value * 2
} else {
throw IllegalArgumentException("Value must be positive")
}
Наиболее часто используемые исключения
RuntimeException и его наследники:
-
NullPointerException- обращение к null ссылкеval str: String? = null val length = str!!.length // Выбросит NullPointerException -
IllegalArgumentException- неверный аргумент методаfun calculateSquareRoot(x: Double): Double { if (x < 0) { throw IllegalArgumentException("x cannot be negative") } return sqrt(x) } -
IllegalStateException- недопустимое состояние объектаclass UserSession { private var loggedIn = false fun performAction() { if (!loggedIn) { throw IllegalStateException("User must be logged in") } // выполнение действия } } -
IndexOutOfBoundsException- выход за границы коллекцииval list = listOf(1, 2, 3) val element = list[5] // Выбросит IndexOutOfBoundsException -
UnsupportedOperationException- неподдерживаемая операцияval immutableList = listOf(1, 2, 3) immutableList.add(4) // Выбросит UnsupportedOperationException
Собственные исключения Kotlin
KotlinNullPointerException- специализированная версия NPEConcurrentModificationException- изменение коллекции во время итерацииNoSuchElementException- отсутствие элемента в коллекцииval emptyList = emptyList<Int>() val first = emptyList.first() // Выбросит NoSuchElementException
Функции-расширения для безопасных операций
Kotlin предоставляет набор функций-расширений для безопасной работы с исключениями:
// runCatching - современная замена try-catch
val result: Result<Int> = runCatching {
"abc".toInt()
}
result.onSuccess { value ->
println("Успех: $value")
}.onFailure { exception ->
println("Ошибка: ${exception.message}")
}.getOrElse {
defaultValue
}
Лучшие практики работы с исключениями
-
Используйте null вместо исключений там, где это уместно
fun findUser(id: Int): User? = users.find { it.id == id } -
Создавайте свои доменные исключения для бизнес-логики
class InsufficientFundsException(amount: Double) : RuntimeException("Insufficient funds: $amount") -
Не игнорируйте исключения в блоках catch без веской причины
-
Используйте Result тип для функционального подхода к обработке ошибок
-
Логируйте исключения на соответствующем уровне
В Android-разработке особое внимание стоит уделять NetworkOnMainThreadException, WindowManager.BadTokenException и другим платформенным исключениям, специфичным для мобильной разработки.
Kotlin предоставляет элегантные инструменты для работы с исключениями, сочетая безопасность типов с гибкостью функционального программирования, что делает код более читаемым и поддерживаемым по сравнению с традиционным Java-подходом.