В соответствии с этим связь, если источник имеет проблему при открытии и выдает исключение, а также находится в круглых скобках try, JVM закрывает его. У меня вопрос, как сообщить пользователю сейчас, что этот источник закрыт, и мы столкнулись с проблемой при открытии этого ресурса? Другими словами, как можно обработать это исключение?
Даже при использовании try-with-resources
предложение catch
все еще работает.
private static void printFile() throws MyCustomException {
try(FileInputStream input = new FileInputStream("file.txt")) {
int data = input.read();
while(data != -1){
System.out.print((char) data);
data = input.read();
}
} catch (IOException e) {
throw new MyCustomException("There was an error while opening the resource", e);
}
}
Кажется тривиальным. Обычно код Java выполняется в какой-то среде «без взаимодействия с пользователем» (серверы и т.п.). Правильный шаг — позволить исключению всплывать — вы хотеть выполняете ежедневную работу, которая находится на полпути к чтению базы данных, чтобы открыть связанный файл, а затем отправить журналы в долгосрочное хранилище или что-то еще в полностью прервать и написать примечание в журнальный файл. Обычно для таких заданий есть некоторая атомарная функциональность (в этом случае, возможно, каждый такой файл независим от других, и можно пока оставить «сломанный» файл на месте, пока администратор сервера не сможет просмотреть его, продолжая обработайте оставшуюся часть - в этом случае «выполнить ротацию резервных копий в ЭТОМ файле» является атомарной функциональностью): поймать все исключения и написать код, который делает то, что вы хотите, когда задание терпит неудачу. Например, мои серверы могут отправлять уведомления прямо на телефоны администраторов (через телеграмму или pushover, или с помощью slack API, и есть много сервисов, которые автоматизируют это и для вас), если это важно, вы бы написали это в своем блоке catch.
Для кода, который непосредственно «запускается» пользователем, скажем, функцией «сохранить файл», это не столько «ресурс сейчас закрыт» — ресурсы недолговечны (они не могут быть — нет, если вы используете try- с ресурсами). Они либо никогда не открывались в первую очередь (вы пытаетесь сохранить файл в несуществующем каталоге - попытка создать новый OutputStream уже не удалась, он никогда не был открыт с самого начала), или, возможно, это открыл, но это было на USB-накопителе, и пользователь вытащил его на полпути сохранения. Ресурс просто закрыт, независимо от того, в java вы его .close()
или нет - вся флешка пропала!!
Единственное, что сделал для вас аспект «безопасного закрытия» попытки с ресурсами, - это убедиться, что ваш Java-процесс не тратит впустую дескриптор файла.
Вы справляетесь с этим так же, как справляетесь практически с любой «неисправимой» (вы не можете написать программное обеспечение, которое гипнотизирует пользователя, заставляя его вставить эту флешку обратно в машину, очевидно, - как следствие, это не восстанавливается, как и большинство исключений) проблема : Вы вызываете диалоговое окно, объясняющее ситуацию.
try (OutputStream out = Files.newOutputStream(saveGameFile)) {
boardState.save(out);
} catch (IOException e) {
// show dialog here
}
Два блока try
не нужны. Оператор try-with-resources может иметь блок catch
.
Странный мой мозгооо, @VGR - спасибо, что заметили! Я отредактировал ответ соответственно.
Как и любое другое исключение: написав код в блоке
catch
. docs.oracle.com/javase/tutorial/essential/exceptions/…