这实际上是一个JDK错误。多年来,已经对其进行了多次报告,但是直到8139507才被Oracle认真对待。
问题出在的JDK源代码中WindowsPreferences.java
。在此类中,两个节点userRoot
和systemRoot
都声明为静态,如:
/**
* User root node.
*/
static final Preferences userRoot =
new WindowsPreferences(USER_ROOT_NATIVE_HANDLE, WINDOWS_ROOT_PATH);
/**
* System root node.
*/
static final Preferences systemRoot =
new WindowsPreferences(SYSTEM_ROOT_NATIVE_HANDLE, WINDOWS_ROOT_PATH);
这意味着,第一次引用该类时,将初始化两个静态变量,并且如果该类HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
不存在,则将尝试为此创建注册表项(=系统树)。
因此,即使用户在自己的代码中采取了所有预防措施,并且从未接触或引用系统树,JVM仍将实际尝试实例化systemRoot
,从而引起警告。这是一个有趣的细微错误。
JDK源代码已在2016年6月发布了一个修复程序,它是Java9以后的一部分。还有一个反向移植了Java8这是U202。
您看到的实际上是来自JDK内部记录器的警告。这也不例外。我相信可以安全地忽略该警告....除非用户代码确实想要系统首选项,但是这种情况很少发生。
奖金信息
该错误不会在Java 1.7.21之前的版本中显示出来,因为在此之前,JRE安装程序会HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
为您创建注册表项,这将有效地隐藏该错误。另一方面,您实际上并不需要运行安装程序才能在计算机上安装JRE,或者至少这不是Sun / Oracle的意图。如您所知,Oracle多年来一直以Windows .tar.gz
格式分发JRE for Windows 。