Винятки
29 питань і відповідей у розділі Винятки.
Питання цього розділу
- В чому різниця між checked та unchecked винятками?
- Що таке checked виняток і коли його використовувати?
- Що таке unchecked виняток (Runtime Exception)?
- Які винятки потрібно обробляти обов’язково?
- Що знаходиться на вершині ієрархії винятків?
- Що таке Throwable?
- В чому різниця між Error та Exception?
- Чи завжди виконується блок finally?
- Що таке try-with-resources?
- Які вимоги до ресурсів в try-with-resources?
- Що таке інтерфейс AutoCloseable?
- В чому різниця між AutoCloseable та Closeable?
- Чи можна створювати власні винятки?
- Коли варто створювати свої винятки?
- Що краще наслідуватись від Exception чи RuntimeException
- Що таке stack trace?
- Що робить метод printStackTrace()?
- Як правильно логовати винятки?
- Що таке загортання (wrapping) винятків?
- Чому не варто ковтати винятки (порожній catch)?
- Що робить ключове слово throws?
- Чи можна викинути checked виняток з методу без throws?
- Що станеться, якщо в блоці finally теж виникне виняток?
- Що таке suppressed винятки?
- Чи можна кілька catch блоків для одного try?
- Що таке multi-catch (catching multiple exceptions)?
- В якому порядку потрібно розташовувати catch блоки?
- Чи можна перехопити і викинути виняток заново?
- Що таке 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
- 🎯 Шпаргалка для співбесіди — ключові тези, часті запитання, червоні прапорці, пов’язані теми