Раздел 7 · 29 вопросов

Исключения

29 вопросов и ответов в разделе Исключения.

Russian Исключения Исходный Markdown
Версии по языкам: English Russian Ukrainian

Вопросы этого раздела

  1. В чём разница между checked и unchecked exceptions?
  2. Что такое checked exception и когда его использовать?
  3. Что такое unchecked exception (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 empty)?
  21. Что делает ключевое слово throws?
  22. Можно ли пробросить checked exception из метода без throws?
  23. Что произойдёт, если в блоке finally тоже возникнет исключение?
  24. Что такое suppressed exceptions?
  25. Можно ли несколько catch блоков для одного try?
  26. Что такое multi-catch (catching multiple exceptions)?
  27. В каком порядке располагать catch блоки?
  28. Можно ли повторно бросить исключение?
  29. Что такое exception chaining?

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

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


📋 Все вопросы

# Вопрос Уровень сложности
1 В чём разница между checked и unchecked исключениями ⭐⭐
2 Что такое checked exception и когда его использовать ⭐⭐
3 Что такое unchecked exception (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 exception из метода без 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
  • 🎯 Шпаргалка для интервью — ключевые тезисы, частые вопросы, красные флаги, связанные темы