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

Какие знаешь исключения в Kotlin?

1.0 Junior🔥 112 комментариев
#JVM и память#Kotlin основы

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

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

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

Исключения в 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 - специализированная версия NPE
  • ConcurrentModificationException - изменение коллекции во время итерации
  • 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 
}

Лучшие практики работы с исключениями

  1. Используйте null вместо исключений там, где это уместно

    fun findUser(id: Int): User? = users.find { it.id == id }
    
  2. Создавайте свои доменные исключения для бизнес-логики

    class InsufficientFundsException(amount: Double) : 
        RuntimeException("Insufficient funds: $amount")
    
  3. Не игнорируйте исключения в блоках catch без веской причины

  4. Используйте Result тип для функционального подхода к обработке ошибок

  5. Логируйте исключения на соответствующем уровне

В Android-разработке особое внимание стоит уделять NetworkOnMainThreadException, WindowManager.BadTokenException и другим платформенным исключениям, специфичным для мобильной разработки.

Kotlin предоставляет элегантные инструменты для работы с исключениями, сочетая безопасность типов с гибкостью функционального программирования, что делает код более читаемым и поддерживаемым по сравнению с традиционным Java-подходом.

Какие знаешь исключения в Kotlin? | PrepBro