В try-with-resources исключение бросают и тело блока, и метод close(). Какое исключение получит вызывающий код?
- Как работает 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 быть идемпотентным?
Разбор темы
- Управление ресурсами: try-with-resources
Беды ручного finally, автозакрытие AutoCloseable, suppressed-исключения и разница Closeable/AutoCloseable.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.