一个简单的问题:我想知道为什么Preferences
方法nodeExists()
抛出必须被捕获的BackingStoreException
?是什么会导致BackingStoreException
的确切原因,以及Preferences
API中的所有方法,为什么要捕获此方法(而不是其他所有方法)?
从Preferences API文档中阅读此段对我没有多大帮助:
从Preferences对象读取首选项的所有方法都要求调用者提供默认值。如果先前未设置任何值或后备存储不可用,则返回默认值。目的是即使后备存储变得不可用,也允许应用程序运行,尽管功能稍有下降。如果后备存储不可用,则类似flush的几种方法具有阻止它们运行的语义。普通应用程序不需要调用任何这些方法,可以通过声明它们抛出BackingStoreException的事实来识别它们。
也许我听不懂,但是对所有Preferences
方法来说,后备存储的不可用都不会带来风险吗?上面的段落使我认为我正在调用“不需要调用”的方法。但是,检查节点是否存在对我来说似乎是一项常见操作。
每次调用nodeExists()
时,都必须在其周围添加一个try / catch
块并处理异常。
最佳答案
nodeExists
可以引发BackingStoreException
,因为它需要访问后备存储以确定节点是否存在。您通常不需要先验地知道节点是否存在,因为调用node(pathName)
或静态*NodeForPackage
会自动创建它及其祖先(如果需要),我会以为这是更常见的模式首选项API的客户端的操作方法-使用各种get
和put
方法获取“您的”节点(必要时创建它)以及在该节点中存储和/或加载值。
获取节点(node
,userRoot
等)的方法不会抛出BackingStoreException
,因为如果后备存储不可用,它们仍然可以通过为您提供一个空节点来进行。该节点上的任何get
调用都将简单地忽略后备存储中的值并为您提供默认值,并且任何put
调用都将无法持久(除非后备存储在刷新该节点之前再次可用) 。首选项API始终是“尽力而为”的系统,旨在通过返回默认值(而不是引发异常)来尽可能地降低性能。
关于java - 为什么nodeExists()抛出BackingStoreException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20009917/