Уроки модуля (2/2)
Попробуйте с ресурсами
В старых версиях Java для управления ресурсами, требующими явного закрытия (например, файлами, подключениями к базе данных или сетевыми потоками), требовался обязательный блок finally, чтобы гарантировать их закрытие. Это привело к созданию многословного и подверженного утечкам кода.
В Java 7 появился оператор try-with-resources, который гарантирует автоматическое закрытие всех ресурсов, объявленных в блоке try, при условии, что они реализуют интерфейс AutoCloseable.
Синтаксис
Ресурсы объявляются и инициализируются внутри круглых скобок сразу после ключевого слова try.
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, разделяя их точкой с запятой ;. Ресурсы будут закрыты в порядке, обратном их объявлению.
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().
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!");
}
}Попробуйте сами
Завершите метод readFile, используя оператор try-with-resources, чтобы инициализировать BufferedReader, обертывающий FileReader по пути. В блоке catch перехватите IOException и напечатайте «Ошибка чтения файла».
Показать подсказку
Объявите BufferedReader в круглых скобках сразу после try и реализуйте обработку IOException.
Решение доступно после 3 попыток
Создайте экземпляр пользовательского ресурса CustomResource внутри блока try-with-resources, вызовите для него метод doWork() и обработайте исключение, напечатав «Error».
Показать подсказку
Используйте `try (CustomResource res = new CustomResource())` и вызовите `res.doWork();` внутри него.
Решение доступно после 3 попыток
Объявите FirstResource и SecondResource в одной и той же конструкции try-with-resources. Обработайте исключение, напечатав «Ошибка».
Показать подсказку
Разделите объявления двух ресурсов внутри круглых скобок `try`, используя точку с запятой `;`.
Решение доступно после 3 попыток