← Назад к вопросам
Какие ресурсы можно использовать в 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
- Автоматическое закрытие - не нужно писать finally блоки
- Безопасность исключений - close() вызывается даже при ошибках
- Подавление исключений - если close() выбросит исключение, оно присоединяется
- Читаемость - код более компактный и понятный
- Меньше утечек ресурсов - невозможно забыть закрыть ресурс
С 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();
}
Это упрощает работу с объектами, которые нужно создать заранее.