Когда вызывается метод close() для ресурсов в Java?

«Когда вызывается метод close() для ресурсов в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод close() вызывается для освобождения ресурсов (файлы, сокеты, соединения). Механизм вызова зависит от способа работы с ресурсом.

1. Автоматический вызов в try-with-resources (рекомендовано с Java 7+): Ресурс, объявленный в скобках try, должен реализовывать AutoCloseable. close() вызывается автоматически при выходе из блока try — как в нормальном случае, так и при возникновении исключения.

   try (FileInputStream fis = new FileInputStream("file.txt");
        BufferedReader br = new BufferedReader(new InputStreamReader(fis))) {
        // Работа с ресурсом
        System.out.println(br.readLine());
   } // Здесь автоматически будут вызваны br.close(), затем fis.close()
   catch (IOException e) {
        // Обработка исключения
   }

2. Ручной вызов в блоке finally (устаревший паттерн):

   BufferedReader br = null;
   try {
        br = new BufferedReader(new FileReader("file.txt"));
        // Работа с ресурсом
   } catch (IOException e) {
        // Обработка
   } finally {
        if (br != null) {
            try {
                br.close(); // Явный вызов
            } catch (IOException e) {
                // Логирование ошибки закрытия
            }
        }
   }

3. Явный вызов программистом:

   Socket socket = new Socket("host", port);
   // ... работа
   socket.close(); // Вызывается в нужный момент кода

Важно: try-with-resources гарантирует закрытие в правильном порядке (обратном порядку объявления) и подавляет исключения от close() в пользу исключений из блока try.