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

Исключения

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

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

  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 вопросов для подготовки к собеседованию на Junior 🟢, Middle 🟡 и Senior 🔴 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
  • 🎯 Шпаргалка для интервью — ключевые тезисы, частые вопросы, красные флаги, связанные темы