Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> java

Try-with-resources в Java: автоматическое управление ресурсами

Мастерство Try-with-resources в Java

Изучите, как оператор try-with-resources в Java упрощает работу с ресурсами, предотвращает утечки и улучшает читаемость кода.

Конструкция try‑with‑resources гарантирует, что все ресурсы, объявленные внутри ее скобок, автоматически закрываются при выходе из блока, будь то нормально или аварийно. Ресурс — это любой объект, реализующий AutoCloseable или Closeable.

Ее синтаксис:

try (ResourceType resource = new ResourceType(...)) { // использование ресурса } catch (ExceptionType e) { // обработка исключений } 

Для использования нужно:

  1. Инстанцировать ресурс внутри клаузы try.
  2. Объявить обработку исключений для любых ошибок, возникших при использовании или закрытии.
Примечание: Только объекты, реализующие AutoCloseable, могут управляться автоматически.


Пример 1: Безопасное чтение файла

import java.io.*; public class Main { public static void main(String[] args) { try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) { String line; while ((line = br.readLine()) != null) { System.out.println("Line =>" + line); } } catch (IOException e) { System.out.println("IOException in try‑with‑resources block =>" + e.getMessage()); } } } 

Вывод, если test.txt отсутствует:

IOException in try‑with‑resources block =>test.txt (No such file or directory)

Вывод, когда файл существует:

Line =>test line

Здесь BufferedReader закрывается автоматически после блока, устраняя необходимость в клаузе finally.


Подавленные исключения (Suppressed Exceptions)

Когда и блок try, и закрытие ресурса выбрасывают исключения, исключение из блока try имеет приоритет, а другое подавляется. Вы можете получить подавленные исключения через Throwable.getSuppressed():

catch (IOException e) { System.out.println("Thrown exception =>" + e.getMessage()); for (Throwable t : e.getSuppressed()) { System.out.println("Suppressed exception =>" + t); } } 

Почему использовать Try-with-resources?

1. Устраняет ручную очистку

До Java 7 блок finally был обязателен для закрытия ресурсов. Это добавляло шаблонный код и потенциал для вложенных try‑catch внутри finally, если закрытие само выбрасывало исключение. С try-with-resources очистка неявна:

BufferedReader br = null; try { br = new BufferedReader(new FileReader("test.txt")); // использование br } catch (IOException e) { // обработка } finally { if (br != null) { try { br.close(); } catch (IOException ignored) {} } } 

Вышеприведенный паттерн более громоздкий и подвержен ошибкам по сравнению с:

try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) { // использование br } 

2. Несколько ресурсов в одном операторе

Объявите несколько ресурсов, разделенных точкой с запятой. Они закрываются в обратном порядке объявления.

try (Scanner scanner = new Scanner(new File("testRead.txt")); PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) { while (scanner.hasNext()) { writer.print(scanner.nextLine()); } } 

3. Улучшение в Java 9

Java 9 ослабила требование, что ресурсы должны объявляться локально. Теперь можно повторно использовать существующую переменную:

Scanner scanner = new Scanner(new File("testRead.txt")); try (scanner) { // код } 

Эта функция улучшает читаемость, когда тот же ресурс нужен в другом месте.


Для более глубокого понимания обратитесь к официальной документации AutoCloseable и заметкам релиза Java 9 JEP 326.

java

  1. Освоение операторов Java: типы, синтаксис и практические примеры
  2. Комментарии в Java: типы, использование и лучшие практики
  3. Освоение Java if…else: управление потоком выполнения
  4. Освоение улучшенного цикла for в Java: синтаксис, примеры и лучшие практики
  5. Освоение строк в Java: создание, методы и лучшие практики
  6. Интерфейсы в Java: концепции, реализация и лучшие практики
  7. Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
  8. Аннотации в Java: типы, размещение и практические примеры
  9. Assertions в Java: практическое руководство по обнаружению багов и обеспечению надежности кода
  10. Понимание Java Vector: использование, особенности и сравнение с ArrayList