2013-11-15 76 views
2

簡單的問題:我想知道爲什麼Preferences方法nodeExists()拋出必須被捕獲的BackingStoreException?究竟什麼原因會導致BackingStoreException以及Preferences API中的所有方法,爲什麼這種方法(而不是所有其他方法)都要求它被捕獲?爲什麼nodeExists()拋出BackingStoreException

讀取來自Preferences API文檔本款不幫助我很多:

的讀取從首喜好的方法的所有對象需要調用者提供一個默認值。如果先前未設置任何值或後備存儲不可用,則返回默認值。目的是允許應用程序運行,儘管功能略有降低,即使後備存儲變得不可用。有些方法(如flush)具有語義,在後備存儲不可用的情況下阻止它們運行。普通應用程序不應該調用任何這些方法,這些方法可以通過聲明拋出BackingStoreException的事實來識別。

也許我不明白,但支持存儲的不可用性是不是所有Preferences方法的風險?上面的段落讓我覺得我正在調用一種我應該「不需要調用」的方法。然而,檢查節點是否存在似乎對我來說是一種常見操作。

每次我打電話nodeExists()我必須在它周圍添加一個try/catch塊並處理異常。

回答

1

nodeExists可以拋出BackingStoreException,因爲它要求要求訪問後備存儲以確定是否存在節點。您通常不需要事先知道是否存在節點,因爲調用node(pathName)或靜態*NodeForPackage將自動創建它及其祖先(如果需要),並且我會認爲這將是客戶更常用的操作模式的偏好API - 使用各種getput方法獲取「您的」節點(如有必要,創建它)以及節點中的存儲和/或加載值。

即獲得節點(nodeuserRoot等)的方法做BackingStoreException因爲如果後備存儲不可用,他們仍然可以給你一個空節點進行。該節點上的任何get調用將簡單地忽略後備存儲中的值,併爲您提供您提供的默認值,並且任何put調用都將無法保留(除非在刷新節點之前備份存儲再次可用)。首選項API只是一個「盡力而爲」的系統,旨在通過返回默認值而不是拋出異常來優雅地降級。

+0

獲取節點的方法如何在沒有後備存儲的情況下繼續進行?我想我對有什麼後盾商店有些困惑,以及爲什麼有些操作可以在沒有它的情況下繼續...... – ryvantage

+0

預期的用例首選項是存儲諸如最近打開的文檔列表之類的東西,窗口上次關閉時,啓動文件選擇器的目錄等,即改善用戶體驗但對應用程序的正常運行並不關鍵的事情。如果後備存儲(Windows上的註冊表,其他平臺的磁盤上的文件)因任何原因而不可用,則應用程序仍然可以工作,但用戶只會獲取默認值而不是他們的個人偏好。 –

相關問題