Ответ 1
Недавно я начал замечать одно и то же предупреждение и думал, что это означает, что реестр не может быть записан. Но при ближайшем рассмотрении я заметил, что все настройки, которые успешно обновлены в HKEY_CURRENT_USER, в любом случае. Поэтому мне стало любопытно, почему я вижу это предупреждение.
Оказалось, что виновником является эта статическая переменная-член: WindowsPreferences.systemRoot
Похоже, что Java пытается инициализировать WindowsPreferences.systemRoot на всякий случай, когда она используется позже программой, и что инициализация, очевидно, терпит неудачу, если программа не запущена как администратор.
Поскольку вы используете Preferences.userNodeForPackage(), вам никогда не понадобится systemRoot, поэтому вы можете смело игнорировать это предупреждение.
Конечно, это ужасная практика, которую Java пытается инициализировать systemRoot, когда она не запрашивается.
Обновление: Я тестировал эту проблему в различных версиях Java и пришел к выводу, что эта ошибка была введена в Java 1.7.0_21. Он отлично работал в Java 1.7.0_17 просто потому, что установщик этой версии создаст папку "Pref" в реестре! Конечно, даже в этой версии, если вы хотите удалить "Pref" из реестра, это перестанет работать, поэтому с самого начала Oracle это было глупое решение. Я напишу отчет об ошибке.
Обновление 2: Предупреждающее сообщение не является ошибкой. Кажется, это предполагаемое поведение: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6809488