Выбор ответа Middle Java-интероп обновлено
Зачем нужна аннотация @Throws
Вопрос
Kotlin-функция бросает IOException. Почему Java-код с catch (IOException e) вокруг её вызова не компилируется?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: В байткоде нет throws IOException, нужен @Throws. В Kotlin нет checked-исключений, поэтому в байткоде у метода нет throws IOException.
Варианты ответа
- Kotlin оборачивает все исключения в
RuntimeException - Java не может ловить исключения, брошенные из Kotlin-кода
IOExceptionв Kotlin это другой класс,kotlin.io.IOException- В байткоде нет
throws IOException, нужен@Throwsправильный ответ
Разбор
В Kotlin нет checked-исключений, поэтому в байткоде у метода нет throws IOException. Компилятор Java запрещает catch checked-исключения, которое, по сигнатуре, не может быть брошено. @Throws(IOException::class) добавляет объявление в байткод. Исключение при этом бросается то же самое, Kotlin ничего не оборачивает.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.