Выбор ответа Middle Java-интероп обновлено

Зачем нужна аннотация @Throws

Вопрос

Kotlin-функция бросает IOException. Почему Java-код с catch (IOException e) вокруг её вызова не компилируется?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: В байткоде нет throws IOException, нужен @Throws. В Kotlin нет checked-исключений, поэтому в байткоде у метода нет throws IOException.

Варианты ответа

  1. Kotlin оборачивает все исключения в RuntimeException
  2. Java не может ловить исключения, брошенные из Kotlin-кода
  3. IOException в Kotlin это другой класс, kotlin.io.IOException
  4. В байткоде нет throws IOException, нужен @Throwsправильный ответ

Разбор

В Kotlin нет checked-исключений, поэтому в байткоде у метода нет throws IOException. Компилятор Java запрещает catch checked-исключения, которое, по сигнатуре, не может быть брошено. @Throws(IOException::class) добавляет объявление в байткод. Исключение при этом бросается то же самое, Kotlin ничего не оборачивает.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме