【问题标题】:Why does nodeExists() throw BackingStoreException为什么 nodeExists() 会抛出 BackingStoreException
【发布时间】:2013-11-15 20:20:50
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java preferences


    【解决方案1】:

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

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

    【讨论】:

    • 获取节点的方法如何在没有后备存储的情况下进行?我想我对什么是后备商店以及为什么有些操作可以在没有它的情况下继续进行有点困惑......
    • 首选项的预期用例是存储最近打开的文档列表、上次关闭窗口的位置、启动文件选择器的目录等内容。即改善用户体验但对应用程序的正确运行并不重要的东西。如果后备存储(Windows 上的注册表,其他平台的磁盘上的文件)由于任何原因不可用,应用程序仍然可以工作,但用户只会获得默认值而不是他们的个人偏好。
    猜你喜欢
    • 2011-01-02
    • 2021-12-20
    • 2021-03-05
    • 2021-03-19
    • 2023-03-14
    • 2021-04-09
    • 2014-12-18
    • 2013-12-08
    • 2010-09-27
    相关资源
    最近更新 更多