Это на самом деле ошибка 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
, вызывая предупреждение. Это интересная тонкая ошибка.
В июне 2016 года исправлено исправление источника JDK, и оно является частью Java9 и далее. Там также портировать для Java8 , который находится в U202.
То, что вы видите, на самом деле является предупреждением от внутреннего регистратора JDK. Это не исключение. Я считаю, что предупреждение можно безопасно игнорировать .... если пользовательский код действительно не требует системных настроек, но это очень редко имеет место.
Информация о бонусе
Ошибка не проявлялась в версиях до Java 1.7.21, потому что до этого установщик JRE создавал HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs
для вас ключ реестра , и это эффективно скрывало ошибку. С другой стороны, вам никогда не требовалось запускать установщик, чтобы иметь JRE на вашем компьютере, или, по крайней мере, это не было целью Sun / Oracle. Как вам известно, Oracle много лет распространяет JRE для Windows в .tar.gz
формате.