栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java:java.util.Preferences失败

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java:java.util.Preferences失败

不幸的是,您在这里得到的大多数答案都是错误的……至少是错误的。从某种意义上说是在治疗症状,而不是原因。

让我们回顾一下。Java
Preferences有两个“树”:用户树和系统树。您可以将自己的后端编写到Java
Preferences(称为后备存储),但很少有开发人员这样做,因此最终得到了JDK的默认后备存储。在Windows平台上,这表示Win注册表,更具体地说:

  • 用户树 被写入
    HKEY_CURRENT_USERSoftwareJavaSoftPrefs
    (操作系统用户 总是 有写访问这里)
  • 系统树 被写入
    HKEY_LOCAL_MACHINESoftwareJavaSoftPrefs
    (仅管理员PRIVS操作系统的用户有写权限这里)

总结:只要您的代码不尝试使用系统树,您就可以了,也不必在操作系统级别上分配特权。系统树适用于“主机上的所有用户”,而用户树适用于特定的登录用户。对于您的情况,我相信您可以满足用户树的需要,因此这确实是您的解决方案。不要搞乱特权,以管理员身份运行,否则就不行。

....但还有更多。假设您的代码没有按照指示触及Java Preferences系统树。然后,您 仍然 会在Windows上看到此警告:

WARNING [java.util.prefs]: Could not open/create prefs root node SoftwareJavaSoftPrefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error pre 5.

那么发生了什么?我给你错了建议吗?并不是的。跟我在一起。

深入研究JDK源代码,您将看到0x80000002表示HKLM,即Win
Registry中不应被触摸的位置。您的代码从不引用系统树,但是您仍然看到此警告!(在这一点上,您必须像我一样把所有的头发都扯掉。)

嗯,这是真正的JDK错误的罕见情况之一。您可以在我的答案中阅读更多有关此内容的信息,如果您对为什么多年来无法在JDK中检测到细微的错误感兴趣,我建议您阅读。该错误自JDK
1.4起就存在,但直到最近才得到修复,尚未反向移植到JDK 8。

最佳建议

  • 确保您的代码仅引用用户树,而不引用系统树。公平的是,操作系统要求您提供所有类型的privs才能写入系统范围的位置。如果您 确实 需要写到这样的位置,那么除了分配priv,以管理员身份执行或没有其他操作之外,实际上没有别的解决方案。
  • 忽略警告。一旦使用Java 9或Oracle决定将错误修复程序移植到Java 8中,它将消失。警告可以放心地忽略。
  • 或者,您可以尝试以编程方式忽略该警告。它来自JDK的Platform Logger,所以这样的事情应该可以工作,尽管我自己还没有尝试过:
        sun.util.logging.PlatformLogger platformLogger = PlatformLogger.getLogger("java.util.prefs");    platformLogger.setLevel(PlatformLogger.Level.OFF);


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/374945.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号