Перейти к основному содержимому

5.09. Иерархия исключений в Kotlin

Разработчику Архитектору

Иерархия исключений в Kotlin

В Kotlin нет собственной иерархии исключений — он полностью использует модель исключений Java, поскольку компилируется в байт-код JVM (или в нативный код/JS с соответствующими адаптациями). На платформе JVM все исключения Kotlin являются подклассами java.lang.Throwable, как и в Java.

Однако Kotlin вносит семантические изменения:

  • Все исключения в Kotlin непроверяемые (unchecked), даже если они наследуются от java.lang.Exception.
  • Нет ключевого слова throws в сигнатурах функций.
  • Нет необходимости объявлять или перехватывать исключения.

Иерархия исключений в Kotlin (на JVM)

Корневой класс:

  • kotlin.Throwable — псевдоним для java.lang.Throwable.

Основные категории:

  1. kotlin.Exception — псевдоним для java.lang.Exception.
    Включает все стандартные исключения, такие как:

    • IllegalArgumentException
    • IllegalStateException
    • NullPointerException
    • IndexOutOfBoundsException
      • ArrayIndexOutOfBoundsException
    • ArithmeticException
    • ClassCastException
    • NumberFormatException
    • IOException и его подклассы (например, FileNotFoundException)
    • и другие исключения из java.lang, java.io, java.util и т.д.
  2. kotlin.Error — псевдоним для java.lang.Error.
    Используется для фатальных ошибок времени выполнения:

    • OutOfMemoryError
    • StackOverflowError
    • NoClassDefFoundError
    • AssertionError
    • и др.

Специфичные исключения Kotlin (встроенные в стандартную библиотеку Kotlin)

Эти исключения определены в пакете kotlin и предназначены для использования в идиоматичном Kotlin-коде:

  • kotlin.IllegalArgumentException — выбрасывается при передаче недопустимого аргумента (например, через require()).
  • kotlin.IllegalStateException — выбрасывается при нарушении состояния объекта (например, через check()).
  • kotlin.NullPointerException — возникает при разыменовании null (например, при использовании оператора !!).
  • kotlin.IndexOutOfBoundsException — выбрасывается при выходе за границы коллекции или массива.
  • kotlin.ArithmeticException — например, при делении на ноль.
  • kotlin.TypeCastException — при неудачном приведении типа (as).
  • kotlin.NoSuchElementException — например, при вызове .first() на пустой коллекции.
  • kotlin.UnsupportedOperationException — при вызове не поддерживаемой операции (например, изменение неизменяемого списка).

Все эти исключения — алиасы соответствующих классов Java (java.lang.*), но используются в контексте Kotlin-стандартной библиотеки.


Особенности:

  • Нет проверяемых исключений: даже если функция на Java помечена как throws IOException, в Kotlin её можно вызывать без try-catch или объявления throws.

  • Функции-помощники: Kotlin предоставляет встроенные функции для генерации исключений:

    • error(message)IllegalStateException
    • require(condition)IllegalArgumentException
    • check(condition)IllegalStateException
    • TODO()NotImplementedError (подкласс RuntimeException)
  • NotImplementedError: специфичное исключение Kotlin, используемое по умолчанию в заглушках TODO(). Наследуется от java.lang.RuntimeException.


Примеры типичных исключений в Kotlin-коде:

listOf(1, 2, 3)[10]          // IndexOutOfBoundsException
null!! // NullPointerException
"abc".toInt() // NumberFormatException
listOf<Int>().first() // NoSuchElementException
TODO("not implemented") // NotImplementedError

На других платформах:

  • Kotlin/Native: использует собственную иерархию исключений, но сохраняет совместимость по именам (kotlin.Exception, kotlin.Error и т.д.). Проверяемых исключений также нет.
  • Kotlin/JS: исключения маппятся на JavaScript-ошибки (Error, TypeError и т.д.), но с сохранением Kotlin-интерфейса.

Таким образом, список типов исключений в Kotlin совпадает с Java на JVM, но с ключевым отличием: все исключения считаются непроверяемыми, а стандартная библиотека Kotlin активно использует подмножество java.lang.* исключений для своих встроенных функций.