Ответ
Явное закрытие ресурсов критически важно для предотвращения утечек ресурсов, которые ведут к нестабильности приложения и всей системы.
Последствия незакрытия ресурсов:
- Утечка дескрипторов (file descriptors, socket handles): Операционная система ограничивает их число на процесс. Исчерпание лимита приведёт к ошибкам вида "Too many open files".
- Утечка памяти: Некоторые ресурсы удерживают в памяти большие буферы.
- Блокировки: Незакрытые файлы могут оставаться заблокированными для записи другими процессами. Незакрытые соединения с БД исчерпывают пул соединений на сервере.
Механизмы закрытия в Java:
-
Классический try-finally (до Java 7):
FileInputStream fis = null; try { fis = new FileInputStream("file.txt"); // работа с ресурсом } finally { if (fis != null) { try { fis.close(); // Гарантированный вызов } catch (IOException e) { // Логирование ошибки закрытия } } } -
Try-with-resources (Java 7+): Рекомендуемый способ. Ресурсы, реализующие
AutoCloseable, закрываются автоматически.try (FileInputStream fis = new FileInputStream("file.txt"); BufferedReader br = new BufferedReader(new InputStreamReader(fis))) { // работа с ресурсами } // close() вызывается автоматически для fis и br в обратном порядкеПреимущества: Короткий синтаксис, подавление исключений (suppressed exceptions), гарантированное закрытие даже при исключении в блоке
tryилиclose().
Правило: Всегда используйте try-with-resources для работы с любыми ресурсами, реализующими AutoCloseable (InputStream, OutputStream, Connection, Statement, Socket и т.д.).