Гарантирует ли интерфейс Closeable автоматическое закрытие ресурсов в Java?

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

Ответ

Нет. Интерфейс Closeable (и его родитель AutoCloseable) лишь определяет контракт — метод close(). Автоматическое закрытие обеспечивает конструкция try-with-resources.

Как это работает:

  1. Без автоматизации (устаревший, рискованный способ):
    FileInputStream fis = null;
    try {
        fis = new FileInputStream("file.txt");
        // работа с ресурсом
    } finally {
        if (fis != null) {
            fis.close(); // Закрытие вручную, можно забыть
        }
    }
  2. С автоматическим закрытием (рекомендуется с Java 7+):
    try (FileInputStream fis = new FileInputStream("file.txt");
         BufferedReader br = new BufferedReader(new InputStreamReader(fis))) {
        // работа с ресурсами
    } // close() вызывается автоматически для fis и br в обратном порядке

    Ключевое отличие: Closeable.close() выбрасывает IOException, а AutoCloseable.close()Exception. try-with-resources работает с любым объектом, реализующим AutoCloseable.