Java 为什么nodeExists()抛出BackingStoreException

Java 为什么nodeExists()抛出BackingStoreException,java,preferences,Java,Preferences,简单问题:我想知道为什么Preferences方法nodeExists()抛出必须捕获的BackingStoreException?究竟是什么导致了备份存储异常,在首选项API中的所有方法中,为什么此方法(而不是所有其他方法)需要捕获它 阅读文档中的这一段对我没有多大帮助: 从preferences对象读取首选项的所有方法都要求调用程序提供默认值。如果以前未设置任何值或备份存储不可用,则返回默认值。其目的是允许应用程序运行,尽管功能略有下降,即使备份存储变得不可用。有几种方法(如flush)的语

简单问题:我想知道为什么
Preferences
方法
nodeExists()
抛出必须捕获的
BackingStoreException
?究竟是什么导致了
备份存储异常
,在
首选项
API中的所有方法中,为什么此方法(而不是所有其他方法)需要捕获它

阅读文档中的这一段对我没有多大帮助:

从preferences对象读取首选项的所有方法都要求调用程序提供默认值。如果以前未设置任何值或备份存储不可用,则返回默认值。其目的是允许应用程序运行,尽管功能略有下降,即使备份存储变得不可用。有几种方法(如flush)的语义可以防止它们在备份存储不可用时运行。普通应用程序不需要调用这些方法中的任何一个,可以通过声明它们抛出BackingStoreException来识别这些方法

也许我不明白,但是备份存储的不可用不是对所有
首选项
方法都有风险吗?上面这段话让我觉得我在调用一个“应该不需要调用”的方法,但是检查一个节点是否存在对我来说似乎是一个常见的操作


每次调用
nodeExists()
时,我必须在其周围添加
try/catch
块并处理异常。

nodeExists
可以抛出
BackingStoreException
,因为它需要访问备份存储以确定节点是否存在。您通常不需要事先知道节点是否存在,因为调用
节点(路径名)
或静态
*NodeForPackage
将自动创建它及其祖先(如果需要),我认为这将是首选项API的客户端更常见的操作模式-获取“您的”节点(必要时创建)并使用各种
get
put
方法在节点中存储和/或加载值


获取节点的方法(
node
userRoot
等)不要抛出
BackingStoreException
,因为如果备份存储不可用,它们仍然可以通过给您一个空节点来继续。在该节点上的任何
get
调用都将忽略备份存储中的值,并给您提供默认值,并且任何
put
调用都将无法持久(除非备份存储在刷新节点之前再次可用)。preferences API只是一种“尽力而为”系统,设计为尽可能通过返回默认值而不是抛出异常来优雅地降级。

获取节点的方法如何在没有备份存储的情况下继续进行?我想我对什么是备份存储以及为什么一些操作可以在没有备份存储的情况下继续进行有点困惑…首选项的预期用例是或类似最近打开的文档列表、上次关闭窗口时窗口的位置、启动文件选择器的目录等内容,即改善用户体验但对应用程序的正确运行并不重要的内容。如果备份存储(Windows上的注册表,其他平台上磁盘上的文件)由于任何原因都不可用。应用程序仍能工作,但用户只会获得默认值,而不是他们的个人偏好。