一个简单的问题:我想知道为什么Preferences方法nodeExists()抛出必须被捕获的BackingStoreException?是什么会导致BackingStoreException的确切原因,以及Preferences API中的所有方法,为什么要捕获此方法(而不是其他所有方法)?

Preferences API文档中阅读此段对我没有多大帮助:


  从Preferences对象读取首选项的所有方法都要求调用者提供默认值。如果先前未设置任何值或后备存储不可用,则返回默认值。目的是即使后备存储变得不可用,也允许应用程序运行,尽管功能稍有下降。如果后备存储不可用,则类似flush的几种方法具有阻止它们运行的​​语义。普通应用程序不需要调用任何这些方法,可以通过声明它们抛出BackingStoreException的事实来识别它们。


也许我听不懂,但是对所有Preferences方法来说,后备存储的不可用都不会带来风险吗?上面的段落使我认为我正在调用“不需要调用”的方法。但是,检查节点是否存在对我来说似乎是一项常见操作。

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

最佳答案

nodeExists可以引发BackingStoreException,因为它需要访问后备存储以确定节点是否存在。您通常不需要先验地知道节点是否存在,因为调用node(pathName)或静态*NodeForPackage会自动创建它及其祖先(如果需要),我会以为这是更常见的模式首选项API的客户端的操作方法-使用各种getput方法获取“您的”节点(必要时创建它)以及在该节点中存储和/或加载值。

获取节点(nodeuserRoot等)的方法不会抛出BackingStoreException,因为如果后备存储不可用,它们仍然可以通过为您提供一个空节点来进行。该节点上的任何get调用都将简单地忽略后备存储中的值并为您提供默认值,并且任何put调用都将无法持久(除非后备存储在刷新该节点之前再次可用) 。首选项API始终是“尽力而为”的系统,旨在通过返回默认值(而不是引发异常)来尽可能地降低性能。

关于java - 为什么nodeExists()抛出BackingStoreException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20009917/

10-10 02:27