Ответ
Нет, блок 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().