Вопрос с собеседования · Java

В try-with-resources исключение бросают и тело блока, и метод close(). Какое исключение получит вызывающий код?

MiddleИсключения и ресурсы
Ещё спрашивают так:
  • Как работает try-with-resources и что такое suppressed-исключения?
Коротко

Наверх идёт исключение из тела — оно о настоящей причине. Исключение из close() прикрепляется к нему как suppressed (getSuppressed(), видно в стектрейсе). Ручной try/finally терял исходное: исключение в finally его затирало.

  • Если упал только close — наверх идёт оно
  • Ресурсы закрываются в обратном порядке даже при исключениях в close
  • addSuppressed можно вызывать и вручную

А ещё Именно эту проблему try-with-resources и решал

Подробно

Ровно эту проблему конструкция и решала. При ручном try/finally исключение из close() внутри finally затирало исходное, и настоящая причина сбоя терялась — отладка превращалась в угадывание. Теперь приоритет отдан исключению из тела, а ошибка закрытия доступна через getSuppressed() и печатается в стектрейсе с пометкой Suppressed. Стоит помнить и про порядок: ресурсы закрываются в обратном порядке объявления, а начиная с Java 9 в скобках можно указывать уже существующую final или effectively final переменную.

Что хотят услышать

  • Какое исключение получит вызывающий.
  • Механизм suppressed и сравнение с finally.

Частые ошибки

  • Писать закрытие в finally вручную и терять исходное исключение.
  • Не знать про getSuppressed при разборе инцидента.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Исключение из close(), потому что оно произошло позже и перекрывает первое
  • ✓Исключение из тела блока, а исключение из close() прикрепляется к нему как suppressed
  • ✗Оба поочерёдно — сначала одно, потом другое
  • ✗Первое исключение теряется, как и при ручном finally

Что спросят дальше

  • Чем AutoCloseable отличается от Closeable?
  • В каком порядке закрываются несколько ресурсов?
  • Чем Closeable отличается от AutoCloseable?
  • Должен ли close быть идемпотентным?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования