Выбор ответа Senior Исключения обновлено

Цена исключения

Вопрос

Почему исключения не используют для обычного управления потоком (например, как break из глубокого цикла)?

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

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

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

Коротко

Правильный ответ: Создание исключения дорогое (стектрейс), код хуже читается. Основная цена в конструкторе Throwable: fillInStackTrace обходит стек вызовов.

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

  1. Исключения нельзя бросать внутри циклов, компилятор это запрещает
  2. Создание исключения дорогое (стектрейс), код хуже читаетсяправильный ответ
  3. Каждое брошенное исключение вызывает сборку мусора в молодом поколении
  4. catch-блоки выполняются в отдельном потоке, и состояние цикла теряется

Разбор

Основная цена в конструкторе Throwable: fillInStackTrace обходит стек вызовов. Если исключение действительно нужно как сигнал без стека, есть конструктор Throwable(message, cause, enableSuppression, writableStackTrace) с writableStackTrace = false. Но главное: исключение как goto делает поток управления неочевидным. Бросать в циклах можно, GC и потоки тут ни при чём.

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

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