Ответ
Нет, это антипаттерн. Вызов close() внутри блока try проблематичен по нескольким причинам:
- Нарушение логики: Ресурс должен быть доступен на протяжении всего блока
try. Его преждевременное закрытие сделает последующий код в этом же блоке неработоспособным. - Риск двойного закрытия: Если после этого в блоке
finallyтакже будет вызовclose(), это может привести к исключению или неопределённому поведению. - Исключение в
close()перезапишет основное: Если в основном коде и вclose()возникнут исключения, будет потеряна информация об исходной ошибке.
Правильные подходы:
A. Try-with-resources (рекомендуется с Java 7+):
try (FileInputStream fis = new FileInputStream("file.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fis))) {
// Работа с ресурсами
String line = br.readLine();
// НЕТ необходимости в ручном вызове close()
} // close() будет вызван автоматически в корректном порядке
B. Классический try-catch-finally:
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("file.txt"));
// Работа с ресурсом
} finally {
if (br != null) {
try {
br.close(); // Закрытие В finally блоке гарантирует попытку освобождения
} catch (IOException e) {
// Логирование ошибки закрытия, но не подавление основной
}
}
}
Ключевой принцип: Блок try — для работы с ресурсом, блок finally (или автоматическое управление в try-with-resources) — для его гарантированного освобождения.