Ответ
Конструкция try-with-resources (доступна с Java 7) автоматически закрывает ресурсы. Она работает с любыми объектами, которые реализуют интерфейс java.lang.AutoCloseable (с единственным методом void close()).
Часто используемые ресурсы:
- Потоки ввода-вывода (I/O):
FileInputStream,FileOutputStreamBufferedReader,BufferedWriterScanner
- Ресурсы для работы с сетью:
SocketDatagramSocket
- Ресурсы для работы с базами данных (JDBC):
ConnectionStatement,PreparedStatement,CallableStatementResultSet
- Ресурсы из NIO.2:
DirectoryStream
- Кастомные ресурсы: Любой ваш класс, реализующий
AutoCloseable.
Важные детали:
- Интерфейс
java.io.Closeable(появился раньше) теперь является подтипомAutoCloseable, поэтому всеCloseable-ресурсы также совместимы. - Ресурсы закрываются в обратном порядке их объявления в скобках
try. - Если исключение возникает и в блоке
try, и при закрытии ресурса, исключение из блокаtryпомещается вThrowable.getSuppressed().
Пример использования нескольких ресурсов:
// Автоматическое закрытие Connection и PreparedStatement
String sql = "SELECT * FROM users WHERE active = ?";
try (Connection conn = dataSource.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setBoolean(1, true);
try (ResultSet rs = stmt.executeQuery()) { // Вложенный try-with-resources
while (rs.next()) {
// Обработка результата
}
}
} catch (SQLException e) {
// Обработка исключений
}
Эта конструкция заменяет громоздкие блоки finally с ручным вызовом close() и является предпочтительным способом работы с ресурсами в современном Java.