Получить доступ

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

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

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

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

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

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем