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

Код открывает соединение, затем в том же try создаёт из него statement, и оба объявлены в скобках try-with-resources. В каком порядке они закроются?

MiddleИсключения и ресурсы
Коротко

Сначала statement, потом соединение — в обратном порядке объявления, как раскручивается стек: зависимый ресурс закрывается раньше того, из которого получен.

  • Закрыты будут все, даже если close() предыдущего бросил
  • Ресурс, на котором упало создание, закрывать не нужно — его нет
  • Java 9: можно указать уже существующую effectively final переменную

А ещё Обёртки java.io закрывают вложенный поток сами

Подробно

Порядок не случаен: он гарантирует корректность в типичном случае, когда второй ресурс создан из первого. Закрыть соединение раньше statement означало бы работать с уже закрытым владельцем. Гарантия закрытия при этом полная — каждый объявленный ресурс будет закрыт, даже если close() предыдущего бросил исключение; такие исключения накапливаются как suppressed. Отсюда практический вывод: объявляйте зависимые ресурсы в естественном порядке создания и не пытайтесь закрывать что-либо вручную внутри блока.

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

  • Порядок и почему.
  • Гарантия закрытия всех.

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

  • Закрывать ресурс вручную внутри try-with-resources — получите двойное закрытие.
  • Объявлять зависимый ресурс раньше того, от которого он зависит.

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

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

Показать варианты и ответ
  • ✗Сначала соединение, затем statement — ресурсы закрываются в порядке объявления
  • ✗Порядок не определён спецификацией
  • ✓Сначала statement, затем соединение — в обратном порядке
  • ✗Закроется только последний объявленный ресурс

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

  • Что произойдёт, если close() первого ресурса бросит исключение?
  • Почему в JDBC важно закрывать ResultSet, Statement и Connection именно так?

Разбор темы

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

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

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

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

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