Какие типы ресурсов можно использовать в конструкции try-with-resources в Java?

«Какие типы ресурсов можно использовать в конструкции try-with-resources в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Конструкция try-with-resources (доступна с Java 7) автоматически закрывает ресурсы. Она работает с любыми объектами, которые реализуют интерфейс java.lang.AutoCloseable (с единственным методом void close()).

Часто используемые ресурсы:

  • Потоки ввода-вывода (I/O):
    • FileInputStream, FileOutputStream
    • BufferedReader, BufferedWriter
    • Scanner
  • Ресурсы для работы с сетью:
    • Socket
    • DatagramSocket
  • Ресурсы для работы с базами данных (JDBC):
    • Connection
    • Statement, PreparedStatement, CallableStatement
    • ResultSet
  • Ресурсы из NIO.2:
    • DirectoryStream
  • Кастомные ресурсы: Любой ваш класс, реализующий AutoCloseable.

Важные детали:

  1. Интерфейс java.io.Closeable (появился раньше) теперь является подтипом AutoCloseable, поэтому все Closeable-ресурсы также совместимы.
  2. Ресурсы закрываются в обратном порядке их объявления в скобках try.
  3. Если исключение возникает и в блоке 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.