为什么nodeExists()抛出BackingStoreException

时间:2013-11-15 20:20:51

标签: java preferences

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

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

  

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

也许我不理解它,但是不支持后备存储不存在所有Preferences方法的风险吗?上面的段落让我觉得我在调用一个“我不应该调用”的方法。然而,检查节点是否存在似乎对我来说是一种常见的操作。

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

1 个答案:

答案 0 :(得分:1)

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

获取节点(nodeuserRoot等)的方法抛出BackingStoreException,因为如果后备存储不可用,它们仍然可以继续通过给你一个空节点。对该节点的任何get调用都将忽略后备存储中的值并为您提供您提供的默认值,并且任何put调用都将无法保持(除非后备存储在此之前再次可用)节点被刷新)。首选项API只是一个“尽力而为”的系统,旨在通过返回默认值而不是抛出异常来尽可能地降级。