Перейти к основному содержимому
Модуль 5 · Урок 2 из 210/14 в курсе~12 min
Уроки модуля (2/2)

Попробуйте с ресурсами

В старых версиях Java для управления ресурсами, требующими явного закрытия (например, файлами, подключениями к базе данных или сетевыми потоками), требовался обязательный блок finally, чтобы гарантировать их закрытие. Это привело к созданию многословного и подверженного утечкам кода.

В Java 7 появился оператор try-with-resources, который гарантирует автоматическое закрытие всех ресурсов, объявленных в блоке try, при условии, что они реализуют интерфейс AutoCloseable.

Синтаксис

Ресурсы объявляются и инициализируются внутри круглых скобок сразу после ключевого слова try.

Java
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
    String line = br.readLine();
    System.out.println(line);
} catch (IOException e) {
    System.out.println("I/O Error: " + e.getMessage());
}
// br is closed automatically here, even if an exception occurs

Объявление нескольких ресурсов

Вы можете создать экземпляры нескольких ресурсов внутри одного блока try, разделяя их точкой с запятой ;. Ресурсы будут закрыты в порядке, обратном их объявлению.

Java
try (
    FileReader fr = new FileReader("input.txt");
    FileWriter fw = new FileWriter("output.txt")
) {
    // Use resources
} catch (IOException e) {
    System.out.println("Error: " + e.getMessage());
}

Создание пользовательских ресурсов

Пользовательский ресурс можно использовать в блоке try-with-resources, если он реализует java.lang.AutoCloseable и переопределяет метод close().

Java
public class DatabaseConnection implements AutoCloseable {
    public void query(String sql) {
        System.out.println("Running query: " + sql);
    }

    @Override
    public void close() {
        System.out.println("Connection closed!");
    }
}

Попробуйте сами

Упражнение#java.m5.l2.e1
Попыток: 0Загрузка…

Завершите метод readFile, используя оператор try-with-resources, чтобы инициализировать BufferedReader, обертывающий FileReader по пути. В блоке catch перехватите IOException и напечатайте «Ошибка чтения файла».

Загрузка редактора…
Показать подсказку

Объявите BufferedReader в круглых скобках сразу после try и реализуйте обработку IOException.

Решение доступно после 3 попыток

Упражнение#java.m5.l2.e2
Попыток: 0Загрузка…

Создайте экземпляр пользовательского ресурса CustomResource внутри блока try-with-resources, вызовите для него метод doWork() и обработайте исключение, напечатав «Error».

Загрузка редактора…
Показать подсказку

Используйте `try (CustomResource res = new CustomResource())` и вызовите `res.doWork();` внутри него.

Решение доступно после 3 попыток

Упражнение#java.m5.l2.e3
Попыток: 0Загрузка…

Объявите FirstResource и SecondResource в одной и той же конструкции try-with-resources. Обработайте исключение, напечатав «Ошибка».

Загрузка редактора…
Показать подсказку

Разделите объявления двух ресурсов внутри круглых скобок `try`, используя точку с запятой `;`.

Решение доступно после 3 попыток