根據此鏈接,如果源在打開時出現問題并拋出例外,并且它也在 try 括號中,則 JVM 將其關閉。我的問題是現在如何通知用戶此源已關閉并且我們在打開此資源時遇到了問題?換句話說,如何處理這個例外?
uj5u.com熱心網友回復:
似乎微不足道。通常,java 代碼在某種“無用戶互動”環境(服務器等)中運行。正確的做法是讓例外冒泡-您希望在讀取資料庫中途的日常作業打開相關檔案,然后將日志發送到長期存盤或完全中止并在日志檔案中寫下注釋。通常對于這樣的作業,有一些原子功能(在這種情況下,也許每個這樣的檔案都獨立于其他檔案,并且可以暫時將“損壞”的檔案留在原處,直到服務器管理員可以查看它同時繼續處理其余部分 - 在這種情況下,“在此檔案上執行備份輪換”是原子功能):捕獲所有例外并撰寫在作業失敗時執行所需操作的代碼。例如,我的服務器可以將通知直接發送到管理員電話(通過電報或推送,或使用松弛 API,并且有許多服務也可以為您自動執行此操作),如果它很重要,您可以將其寫在您的 catch 塊中。
對于由用戶直接“觸發”的代碼,比如說一個“保存檔案”功能,那么它并不是“資源現在已關閉” - 資源不會長期存在(它們不能 - 如果你使用 try - 則不會 -有資源)。它們要么一開始就從未打開(您嘗試將檔案保存到不存在的目錄中 - 嘗試使新的 OutputStream 已經失敗的行為,它從一開始就從未打開過),或者,也許它確實打開了,但它是一個 USB 記憶棒,用戶在保存程序中將其拔出。資源剛剛關閉,有效地,無論是否在 java 中.close()- 整個棒都消失了!
try-with-resources 的“安全關閉”方面為您所做的唯一一件事就是確保您的 Java 行程不會浪費檔案句柄。
您處理它的方式與處理幾乎任何“不可恢復”的方式相同(顯然,您不能撰寫催眠用戶將 U 盤插回機器的軟體 - 因此它無法恢復,就像大多數例外情況一樣)問題: 你拋出一個解釋情況的對話框。
try (OutputStream out = Files.newOutputStream(saveGameFile)) {
boardState.save(out);
} catch (IOException e) {
// show dialog here
}
uj5u.com熱心網友回復:
即使使用 a 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);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/446212.html
