Обязателен ли блок catch в конструкции try-with-resources в Java?

«Обязателен ли блок catch в конструкции try-with-resources в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, блок catch не является обязательным.

Главное требование try-with-resources — ресурсы (объявленные в круглых скобках) должны реализовывать интерфейс AutoCloseable или Closeable. Блок catch можно опустить, если вы не планируете обрабатывать исключения на месте.

Пример без catch: Ресурс закроется автоматически, даже если возникнет исключение.

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

Пример с catch: Для локальной обработки исключений.

try (FileInputStream fis = new FileInputStream("file.txt")) {
    // работа с ресурсом
} catch (FileNotFoundException e) {
    System.err.println("Файл не найден: " + e.getMessage());
} catch (IOException e) {
    System.err.println("Ошибка ввода-вывода: " + e.getMessage());
}

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