Исключения
29 вопросов и ответов в разделе Исключения.
Вопросы этого раздела
- В чём разница между checked и unchecked exceptions?
- Что такое checked exception и когда его использовать?
- Что такое unchecked exception (Runtime Exception)?
- Какие исключения нужно обрабатывать обязательно?
- Что находится в вершине иерархии исключений?
- Что такое Throwable?
- В чём разница между Error и Exception?
- Гарантируется ли выполнение блока finally?
- Что такое try-with-resources?
- Какие требования к ресурсам в try-with-resources?
- Что такое AutoCloseable интерфейс?
- В чём разница между AutoCloseable и Closeable?
- Можно ли создавать кастомные исключения?
- Когда стоит создавать свои исключения?
- Что лучше: наследоваться от Exception или RuntimeException?
- Что такое stack trace?
- Что делает метод printStackTrace()?
- Как правильно логировать исключения?
- Что такое оборачивание (wrapping) исключений?
- Почему не стоит глотать исключения (catch empty)?
- Что делает ключевое слово throws?
- Можно ли пробросить checked exception из метода без throws?
- Что произойдёт, если в блоке finally тоже возникнет исключение?
- Что такое suppressed exceptions?
- Можно ли несколько catch блоков для одного try?
- Что такое multi-catch (catching multiple exceptions)?
- В каком порядке располагать catch блоки?
- Можно ли повторно бросить исключение?
- Что такое exception chaining?
Навигатор по разделу
29 вопросов для подготовки к собеседованию на Middle Java Developer.
📋 Все вопросы
🗺️ Карта зависимостей тем
┌──────────────────────────────────────────┐
│ ИЕРАРХИЯ (5-7) │
│ 5. Вершина иерархии (Throwable) │
│ 6. Throwable (состояние, методы) │
│ 7. Error vs Exception │
└──────────────────┬───────────────────────┘
│
┌──────────────────────────┼──────────────────────────┐
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌────────────────────┐
│ CHECKED vs │ │ TRY-CATCH- │ │ СОБСТВЕННЫЕ │
│ UNCHECKED │ │ FINALLY │ │ ИСКЛЮЧЕНИЯ │
│ (1-4) │ │ (8-10) │ │ (13-15) │
│ 1. checked vs │ │ 8. finally │ │ 13. Можно ли │
│ unchecked │ │ 9. try-with │ │ создавать │
│ 2. checked │ │ resources │ │ 14. Когда стоит │
│ 3. unchecked │ │ 10. Требования│ │ 15. Exception vs │
│ 4. Обязательно │ │ к ресурсам │ │ RuntimeException
└───────┬───────┘ └───────┬───────┘ └────────┬───────────┘
│ │ │
└────────────────────────┼────────────────────────┘
▼
┌──────────────────────────────────────────┐
│ РЕСУРСЫ и АВТОЗАКРЫТИЕ (11-12) │
│ 11. AutoCloseable │
│ 12. AutoCloseable vs Closeable │
└──────────────────────────────────────────┘
┌──────────────────────────────────────────┐
│ ОБРАБОТКА и ЛОГИРОВАНИЕ (16-21) │
│ 16. Stack trace │
│ 17. printStackTrace() │
│ 18. Логирование │
│ 19. Wrapping │
│ 20. Empty catch (глотание) │
│ 21. throws │
└──────────────────────────────────────────┘
┌──────────────────────────────────────────┐
│ ПРОДВИНУТЫЕ ТЕМЫ (22-29) │
│ 22. Sneaky throws (type erasure) │
│ 23. finally бросает │
│ 24. Suppressed exceptions │
│ 25. Несколько catch блоков │
│ 26. Multi-catch │
│ 27. Порядок catch блоков │
│ 28. Rethrow │
│ 29. Exception chaining │
└──────────────────────────────────────────┘
🎯 Рекомендуемый порядок изучения
🟢 Уровень Junior (недели 1-2)
| Шаг | Тема | Файлы | Цель |
|---|---|---|---|
| 1 | Иерархия | Q5, Q6, Q7 | Throwable → Error/Exception, чем отличаются |
| 2 | Checked vs Unchecked | Q1, Q2, Q3 | В чём разница, когда что использовать |
| 3 | Обязательно обрабатывать | Q4 | Какие исключения компилятор заставляет |
| 4 | try-catch-finally | Q8 | finally выполняется (почти) всегда |
| 5 | try-with-resources | Q9, Q10 | Автозакрытие ресурсов, LIFO |
| 6 | Собственные исключения | Q13, Q14 | Когда создавать кастомные |
🟡 Уровень Middle (недели 3-4)
| Шаг | Тема | Файлы | Цель |
|---|---|---|---|
| 1 | AutoCloseable vs Closeable | Q11, Q12 | Идемпотентность, flush, когда что |
| 2 | Exception vs RuntimeException | Q15 | Decision tree для выбора |
| 3 | Stack trace | Q16, Q17 | Как читать, почему printStackTrace плох |
| 4 | Логирование | Q18 | SLF4J {}, MDC, PII caveats |
| 5 | Wrapping и rethrow | Q19, Q20, Q28 | Chain of causality, когда оборачивать |
| 6 | throws | Q21 | Контракт метода, checked vs unchecked |
| 7 | Multi-catch и порядок | Q25, Q26, Q27 | First match wins, когда multi-catch |
🔴 Уровень Senior (недели 5-6)
| Шаг | Тема | Файлы | Цель |
|---|---|---|---|
| 1 | Sneaky throws | Q22 | Type erasure, когда опасно |
| 2 | finally + exception | Q23 | Shadowing mechanism, how to preserve |
| 3 | Suppressed exceptions | Q24 | Java 7+, TWR mechanism, addSuppressed |
| 4 | Exception chaining deep dive | Q29 | Cause chain, logging impact |
| 5 | Performance | Q16 (Senior) | fillInStackTrace cost, StackWalker, OmitStackTraceInFastThrow |
| 6 | Production patterns | Q18 (Senior) | Log levels, alert fatigue, duplicate logging |
🔗 Ключевые связи между темами
Тема: Иерархия
Q5 (Вершина) → Q6 (Throwable) → Q7 (Error vs Exception)
↓
Q1 (checked vs unchecked) → Q2 (checked) → Q3 (unchecked)
Ключевые связи:
- Q6 ↔ Q8: Throwable хранит стек-трейс, finally может его «затенить»
- Q7 ↔ Q4: Error не нужно обрабатывать, Exception (checked) — обязательно
Тема: try-catch-finally
Q8 (finally) → Q9 (try-with-resources) → Q10 (Требования к ресурсам)
↓ ↓
Q23 (finally бросает) → Q24 (Suppressed)
Ключевые связи:
- Q8 ↔ Q23: finally может «затенить» исключение из try
- Q9 ↔ Q24: suppressed exceptions появились вместе с try-with-resources (Java 7)
- Q10 ↔ Q11: Требования к ресурсам = AutoCloseable + идемпотентность
Тема: Собственные исключения
Q13 (Можно ли) → Q14 (Когда стоит) → Q15 (Exception vs RuntimeException)
Ключевые связи:
- Q14 ↔ Q3: Доменные unchecked исключения — ожидаемые бизнес-ситуации
- Q15 ↔ Q2: Decision tree для checked vs unchecked
Тема: Обработка и логирование
Q16 (Stack trace) → Q17 (printStackTrace) → Q18 (Логирование)
↓ ↓
Q19 (Wrapping) → Q20 (Empty catch) → Q29 (Exception chaining)
Ключевые связи:
- Q17 ↔ Q18: printStackTrace → System.err, logger → файл с контекстом
- Q19 ↔ Q29: Wrapping = создание цепочки причин (cause chain)
- Q20 ↔ Q18: Глотание исключений = не логировать = терять информацию
Тема: Продвинутые техники
Q22 (Sneaky throws) → Q21 (throws)
Q23 (finally бросает) → Q24 (Suppressed)
Q25 (Несколько catch) → Q26 (Multi-catch) → Q27 (Порядок catch)
Ключевые связи:
- Q22 ↔ Q1: Sneaky throws обходит checked/unchecked разделение
- Q23 ↔ Q8: finally может «затенить» оригинальное исключение
- Q24 ↔ Q9: Suppressed появились с try-with-resources
- Q25-Q27: first match wins, multi-catch = Java 7+ альтернатива
🎓 Шпаргалка: что знать для каждого уровня
🟢 Junior
- Throwable — корень иерархии, Error vs Exception
- Checked = компилятор заставляет обработать, unchecked = нет
- finally выполняется (почти) всегда
- try-with-resources = автозакрытие, ресурс должен быть AutoCloseable
- Не создавайте кастомные исключения без необходимости
- printStackTrace — только для быстрой отладки, не для production
🟡 Middle
- Fail-Fast: unchecked исключения проявляются рано, не «протекают»
- @ControllerAdvice — централизованная обработка в Spring
- LIFO порядок закрытия в TWR
- SLF4J:
logger.error("msg", e)— последний аргумент Throwable - Wrapping: оборачивайте с сохранением cause (
new Exception("msg", cause)) - Multi-catch (Java 7+):
catch (A | B e)— типы не должны быть в отношении наследования - first match wins: catch от общего к конкретному
🔴 Senior
- Sneaky throws: type erasure обманывает компилятор, опасно для API
- Shadowing: исключение из finally «затеняет» из try → используйте addSuppressed
- Suppressed exceptions: механизм TWR, Throwable[] (не List!)
- fillInStackTrace: нативный метод, обход стека ОС, ~1-5 мкс
- StackWalker (Java 9+): lazy access к stack frames, фильтрация
- OmitStackTraceInFastThrow: JVM оптимизирует «горячие» исключения без стек-трейса
- PII в логах: GDPR/PCI DSS нарушения, маскируйте данные
📝 Формат каждого файла
Каждый файл содержит:
- 🟢 Junior Level — базовое понимание, простые аналогии, примеры
- 🟡 Middle Level — внутренности, типичные ошибки, практические примеры
- 🔴 Senior Level — deep dive, edge cases, production experience, monitoring
- 🎯 Шпаргалка для интервью — ключевые тезисы, частые вопросы, красные флаги, связанные темы