Розділ 7 · 29 питань

Винятки

29 питань і відповідей у розділі Винятки.

Ukrainian Винятки Вихідний Markdown
Мовні версії: English Russian Ukrainian

Питання цього розділу

  1. В чому різниця між checked та unchecked винятками?
  2. Що таке checked виняток і коли його використовувати?
  3. Що таке unchecked виняток (Runtime Exception)?
  4. Які винятки потрібно обробляти обов’язково?
  5. Що знаходиться на вершині ієрархії винятків?
  6. Що таке Throwable?
  7. В чому різниця між Error та Exception?
  8. Чи завжди виконується блок finally?
  9. Що таке try-with-resources?
  10. Які вимоги до ресурсів в try-with-resources?
  11. Що таке інтерфейс AutoCloseable?
  12. В чому різниця між AutoCloseable та Closeable?
  13. Чи можна створювати власні винятки?
  14. Коли варто створювати свої винятки?
  15. Що краще наслідуватись від Exception чи RuntimeException
  16. Що таке stack trace?
  17. Що робить метод printStackTrace()?
  18. Як правильно логовати винятки?
  19. Що таке загортання (wrapping) винятків?
  20. Чому не варто ковтати винятки (порожній catch)?
  21. Що робить ключове слово throws?
  22. Чи можна викинути checked виняток з методу без throws?
  23. Що станеться, якщо в блоці finally теж виникне виняток?
  24. Що таке suppressed винятки?
  25. Чи можна кілька catch блоків для одного try?
  26. Що таке multi-catch (catching multiple exceptions)?
  27. В якому порядку потрібно розташовувати catch блоки?
  28. Чи можна перехопити і викинути виняток заново?
  29. Що таке chaining винятків?

Навігатор по розділу

29 запитань для підготовки до співбесіди на Middle Java Developer.


📋 Усі запитання

# Запитання Рівень складності
1 В чому різниця між checked та unchecked винятками ⭐⭐
2 Що таке checked виняток і коли його використовувати ⭐⭐
3 Що таке unchecked виняток (Runtime Exception) ⭐⭐
4 Які винятки потрібно обробляти обов’язково
5 Що знаходиться на вершині ієрархії винятків ⭐⭐
6 Що таке Throwable ⭐⭐
7 В чому різниця між Error та Exception ⭐⭐
8 Чи завжди виконується блок finally ⭐⭐
9 Що таке try-with-resources ⭐⭐
10 Які вимоги до ресурсів в try-with-resources ⭐⭐
11 Що таке інтерфейс AutoCloseable ⭐⭐
12 В чому різниця між AutoCloseable та Closeable ⭐⭐
13 Чи можна створювати власні винятки
14 Коли варто створювати свої винятки ⭐⭐
15 Що краще: наслідувати Exception чи RuntimeException ⭐⭐
16 Що таке stack trace ⭐⭐
17 Що робить метод printStackTrace()
18 Як правильно логувати винятки ⭐⭐
19 Що таке обгортання винятків (wrapping) ⭐⭐
20 Чому не варто ковтати винятки ⭐⭐
21 Що робить ключове слово throws
22 Чи можна пробросити checked виняток з метода без throws ⭐⭐⭐
23 Що станеться, якщо в блоку finally теж виникне виняток ⭐⭐⭐
24 Що таке suppressed exceptions ⭐⭐⭐
25 Чи можна кілька catch блоків для одного try
26 Що таке multi-catch ⭐⭐
27 В якому порядку розташовувати catch блоки ⭐⭐
28 Чи можна повторно кинути виняток ⭐⭐
29 Що таке exception chaining ⭐⭐

🗺️ Карта залежностей тем

                    ┌──────────────────────────────────────────┐
                    │   ІЄРАРХІЯ (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
  • 🎯 Шпаргалка для співбесіди — ключові тези, часті запитання, червоні прапорці, пов’язані теми