Спроба ресурсів Java (на прикладах)

У цьому підручнику ми дізнаємося про інструкцію try-with-resources для автоматичного закриття ресурсів.

Оператор try-with-resourcesавтоматично закриває всі ресурси в кінці виписки. Ресурс - це об’єкт, який слід закрити в кінці програми.

Його синтаксис:

 try (resource declaration) ( // use of the resource ) catch (ExceptionType e1) ( // catch block ) 

Як видно з вищезазначеного синтаксису, ми оголошуємо try-with-resourcesтвердження,

  1. декларування та створення екземпляра ресурсу в tryпункті.
  2. зазначення та обробка всіх винятків, які можуть виникнути під час закриття ресурсу.

Примітка: Оператор try-with-resources закриває всі ресурси, що реалізують інтерфейс AutoCloseable.

Візьмемо приклад, який реалізує try-with-resourcesтвердження.

Приклад 1: спробувати з ресурсами

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

Вихідні дані, якщо файл test.txt не знайдено.

 IOException у блоці try-with-resources => test.txt (такого файлу чи каталогу немає) 

Вихідні дані, якщо файл test.txt знайдено.

 Введення блоку try-with-resources Line => тестовий рядок 

У цьому прикладі ми використовуємо екземпляр BufferedReader для читання даних із test.txtфайлу.

Оголошення та створення екземпляра BufferedReader всередині try-with-resourcesоператора гарантує, що його екземпляр закритий, незалежно від того, чи tryвиконує заяву нормально, чи створює виняток.

Якщо виникає виняток, його можна обробити, використовуючи блоки обробки винятків або ключове слово throws.

Пригнічені винятки

У наведеному вище прикладі винятки можна викинути із try-with-resourcesтвердження, коли:

  • Файл test.txtне знайдено.
  • Закриття BufferedReaderоб’єкта.

Також може бути вилучено виняток з tryблоку, оскільки зчитування файлу може в будь-який час з багатьох причин не вдатися.

Якщо викиди викидаються як з tryблоку, так і з try-with-resourcesоператора, виключається виняток із tryблоку, а виняток із try-with-resourcesвисловлення пригнічується.

Отримання пригнічених винятків

У Java 7 і пізніших версіях пригнічені винятки можна отримати, викликавши Throwable.getSuppressed()метод із винятку, який видає tryблок.

Цей метод повертає масив усіх придушених винятків. Ми отримуємо пригнічені винятки в catchблоці.

 catch(IOException e) ( System.out.println("Thrown exception=>" + e.getMessage()); Throwable() suppressedExceptions = e.getSuppressed(); for (int i=0; i" + suppressedExceptions(i)); ) ) 

Переваги використання спроби використання ресурсів

Ось переваги використання спроби з ресурсами:

1. нарешті блок не потрібен для закриття ресурсу

Перш ніж Java 7 представила цю функцію, нам довелося використовувати finallyблок, щоб переконатися, що ресурс закритий, щоб уникнути витоку ресурсів.

Ось програма, подібна до прикладу 1 . Однак у цій програмі ми використовували нарешті блок для закриття ресурсів.

Приклад 2: Закрити ресурс за допомогою блоку нарешті

 import java.io.*; class Main ( public static void main(String() args) ( BufferedReader br = null; String line; try ( System.out.println("Entering try block"); br = new BufferedReader(new FileReader("test.txt")); while ((line = br.readLine()) != null) ( System.out.println("Line =>"+line); ) ) catch (IOException e) ( System.out.println("IOException in try block =>" + e.getMessage()); ) finally ( System.out.println("Entering finally block"); try ( if (br != null) ( br.close(); ) ) catch (IOException e) ( System.out.println("IOException in finally block =>"+e.getMessage()); ) ) ) ) 

Вихідні дані

 Введення спробного блоку Line => рядок із файлу test.txt Введення остаточного блоку 

Як ми бачимо з наведеного прикладу, використання finallyблоку для очищення ресурсів робить код більш складним.

Помітили try… catchблок і в finallyблоці? Це пов’язано з тим, що an IOExceptionтакож може відбуватися під час закриття BufferedReaderекземпляра всередині цього finallyблоку, тому він також перехоплюється та обробляється.

try-with-resourcesЗаява робить автоматичне керування ресурсами . Нам не потрібно явно закривати ресурси, оскільки JVM їх автоматично закриває. Це робить код більш читабельним і простішим для написання.

2. спробувати з ресурсами з кількома ресурсами

У try-with-resourcesзаяві ми можемо оголосити більше одного ресурсу , розділяючи їх крапкою з комою;

Приклад 3: спробуйте використати кілька ресурсів

 import java.io.*; import java.util.*; class Main ( public static void main(String() args) throws IOException( try (Scanner scanner = new Scanner(new File("testRead.txt")); PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) ( while (scanner.hasNext()) ( writer.print(scanner.nextLine()); ) ) ) ) 

Якщо ця програма виконується без генерування будь-яких винятків, Scannerоб'єкт зчитує рядок із testRead.txtфайлу та записує його у новий testWrite.txtфайл.

Коли робиться кілька оголошень, try-with-resourcesоператор закриває ці ресурси в зворотному порядку. У цьому прикладі PrintWriterспочатку закривається об’єкт, а потім Scannerоб’єкт.

Покращення спроби використання ресурсів Java 9

У Java 7 існує обмеження на try-with-resourcesвисловлювання. Ресурс потрібно оголосити локально в межах його блоку.

 try (Scanner scanner = new Scanner(new File("testRead.txt"))) ( // code ) 

Якби ми оголосили ресурс поза блоком у Java 7, він створив би повідомлення про помилку.

 Scanner scanner = new Scanner(new File("testRead.txt")); try (scanner) ( // code ) 

Для вирішення цієї помилки Java 9 вдосконалила try-with-resourcesоператор, завдяки чому посилання на ресурс можна використовувати, навіть якщо воно не оголошено локально. Наведений вище код тепер буде виконуватися без помилок компіляції.

Цікаві статті...