Выбор ответа Senior Исключения обновлено
Ловить ли Error
Вопрос
Когда разумно ловить OutOfMemoryError или StackOverflowError?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Почти никогда: JVM может быть в плохом состоянии, разве что залогировать и упасть. Поймать Error технически можно, это обычный Throwable.
Варианты ответа
- Почти никогда: JVM может быть в плохом состоянии, разве что залогировать и упастьправильный ответ
- Всегда: так приложение становится устойчивым и переживает любые сбои памяти
- Нельзя: Error невозможно поймать в catch, он минует любые обработчики
- Только StackOverflowError: после него стек уже освобождён и продолжать безопасно
Разбор
Поймать Error технически можно, это обычный Throwable. Но после OOM или переполнения стека объекты могли остаться в несогласованном состоянии (например, блокировка не отпущена, статический инициализатор упал), и продолжать работу опасно. Разумно залогировать на верхнем уровне и упасть, чтобы оркестратор перезапустил процесс. Для OOM есть флаги -XX:+HeapDumpOnOutOfMemoryError и -XX:+ExitOnOutOfMemoryError.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.