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

Ловить ли Error

Вопрос

Когда разумно ловить OutOfMemoryError или StackOverflowError?

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

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

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

Коротко

Правильный ответ: Почти никогда: JVM может быть в плохом состоянии, разве что залогировать и упасть. Поймать Error технически можно, это обычный Throwable.

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

  1. Почти никогда: JVM может быть в плохом состоянии, разве что залогировать и упастьправильный ответ
  2. Всегда: так приложение становится устойчивым и переживает любые сбои памяти
  3. Нельзя: Error невозможно поймать в catch, он минует любые обработчики
  4. Только StackOverflowError: после него стек уже освобождён и продолжать безопасно

Разбор

Поймать Error технически можно, это обычный Throwable. Но после OOM или переполнения стека объекты могли остаться в несогласованном состоянии (например, блокировка не отпущена, статический инициализатор упал), и продолжать работу опасно. Разумно залогировать на верхнем уровне и упасть, чтобы оркестратор перезапустил процесс. Для OOM есть флаги -XX:+HeapDumpOnOutOfMemoryError и -XX:+ExitOnOutOfMemoryError.

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

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