← Назад к вопросам

Какие ресурсы можно использовать в Try With Resources

1.0 Junior🔥 161 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Try-With-Resources в Java

Какие ресурсы поддерживаются

В try-with-resources можно использовать любые объекты, которые реализуют интерфейс AutoCloseable. Это главное условие.

Интерфейс AutoCloseable

AutoCloseable — функциональный интерфейс с одним методом:

public interface AutoCloseable {
    void close() throws Exception;
}

При завершении блока try-with-resources JVM автоматически вызывает метод close() на всех объектах, даже если произойдет исключение.

Встроенные ресурсы

Жава предоставляет множество встроенных классов, реализующих AutoCloseable:

// Работа с файлами
try (FileInputStream fis = new FileInputStream("file.txt")) {
    // чтение
}

// BufferedReader
try (BufferedReader reader = new BufferedReader(
        new FileReader("file.txt"))) {
    String line = reader.readLine();
}

// PreparedStatement в базах данных
try (Connection conn = DriverManager.getConnection(url, user, pass);
     PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users")) {
    // выполнение запроса
}

// Socket для сетевых операций
try (Socket socket = new Socket("localhost", 8080)) {
    OutputStream out = socket.getOutputStream();
}

// Thread пула
try (ExecutorService executor = Executors.newFixedThreadPool(5)) {
    executor.submit(() -> { ... });
}

// Scanner для чтения ввода
try (Scanner scanner = new Scanner(System.in)) {
    String input = scanner.nextLine();
}

Пользовательские ресурсы

Вы можете создать свой класс, реализующий AutoCloseable:

public class DatabaseConnection implements AutoCloseable {
    private Connection conn;
    
    public DatabaseConnection(String url) throws SQLException {
        this.conn = DriverManager.getConnection(url);
    }
    
    @Override
    public void close() throws Exception {
        if (conn != null) {
            conn.close();
        }
    }
    
    public void executeQuery(String sql) throws SQLException {
        // выполнение
    }
}

// Использование
try (DatabaseConnection db = new DatabaseConnection("jdbc:mysql://localhost/mydb")) {
    db.executeQuery("SELECT * FROM users");
} catch (Exception e) {
    System.out.println("Ошибка: " + e.getMessage());
}

Порядок закрытия ресурсов

Ресурсы закрываются в обратном порядке их инициализации:

try (ResourceOne r1 = new ResourceOne();
     ResourceTwo r2 = new ResourceTwo();
     ResourceThree r3 = new ResourceThree()) {
    // используем r1, r2, r3
}
// Закрытие: r3.close(), r2.close(), r1.close()

Преимущества try-with-resources

  1. Автоматическое закрытие - не нужно писать finally блоки
  2. Безопасность исключений - close() вызывается даже при ошибках
  3. Подавление исключений - если close() выбросит исключение, оно присоединяется
  4. Читаемость - код более компактный и понятный
  5. Меньше утечек ресурсов - невозможно забыть закрыть ресурс

С Java 9: effectively final переменные

Начиная с Java 9, в try-with-resources можно использовать переменные, объявленные до блока, если они effectively final:

BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
try (reader) {
    String line = reader.readLine();
}

Это упрощает работу с объектами, которые нужно создать заранее.

Какие ресурсы можно использовать в Try With Resources | PrepBro