我正在尝试运行一个使用Java
在Windows 10
中寻找JDK 10.0.2
首选项的程序。如果在系统节点下找到它们,它将尝试将它们复制到用户自己的节点,然后用户可以根据自己的喜好更改它们。我的阅读或书写偏好都没有运气。我已经在版本8中尝试了几种不同的JDK,然后在理论上安装了10个JDK可能会更好,但是却没有。
我的程序是几年前写的一款老游戏。上一次我在2012年运行它时,它运行良好。(那时,我可能正在运行JDK 6
和Windows XP
。)
在另一个StackOverflow讨论中,我找到了一些使用首选项的代码,这比我自己的代码要简单得多,对其进行了一些修改,然后尝试运行它以查看是否可以提出一个易于复制的示例:< / p>
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
public class Prefs01 {
public static void main( final String[] args ) throws BackingStoreException {
Preferences systemRoot = Preferences.systemRoot();
Preferences preferences = systemRoot.node("fuzz");
systemRoot.put( "foo", "bar" );
systemRoot.put( "baz", "lolz" );
System.out.println( "-------------------------------" );
String[] keys = preferences.keys();
for( String key : keys ) {
System.out.println( key );
}
System.out.println( "-------------------------------" );
keys = systemRoot.keys();
for( String key : keys ) {
System.out.println( key );
}
}
}
结果
Preferences systemRoot = Preferences.systemRoot();
调试器显示此语句后,systemRoot为“ /”;到目前为止没有错误。
Preferences preferences = systemRoot.node("fuzz");
控制台产生此消息:
Oct 01, 2018 5:05:24 PM java.util.prefs.WindowsPreferences <init>
WARNING: Could not create windows registry node Software\JavaSoft\Prefs\fuzz at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
systemRoot.put( "foo", "bar" );
控制台产生此消息和堆栈跟踪:
2018年10月1日下午5:09:38 java.util.prefs.WindowsPreferences openKey 警告:无法打开Windows注册表节点Software \ JavaSoft \ Prefs 在根0x80000002 Windows RegOpenKey(...)返回了错误代码5。 线程“主”中的异常java.lang.SecurityException:无法打开 根目录为0x80000002的Windows注册表节点Software \ JavaSoft \ Prefs: 拒绝访问 java.prefs / java.util.prefs.WindowsPreferences.openKey(WindowsPreferences.java:553) 在 java.prefs / java.util.prefs.WindowsPreferences.openKey(WindowsPreferences.java:515) 在 java.prefs / java.util.prefs.WindowsPreferences.openKey(WindowsPreferences.java:501) 在 java.prefs / java.util.prefs.WindowsPreferences.putSpi(WindowsPreferences.java:652) 在 java.prefs / java.util.prefs.AbstractPreferences.put(AbstractPreferences.java:263) 在Prefs01.main(Prefs01.java:13)
根据收到的错误消息,给我的印象是我有某种Windows授权问题:我无权执行Windows注册表中要执行的操作。这对我来说毫无意义,因为这台计算机上只有一个UAC
,并且是管理员。我不知道有什么方法可以在不同的UAC
下运行该程序,即使计算机上还有另一个UAC
也是如此。
任何人都可以弄清楚这里出了什么问题以及我需要做些什么来解决它吗?
答案 0 :(得分:0)
正如一些评论者所述,运行“以管理员身份”可能会解决问题。
但是,此错误和代码中给出了问题的根本原因:
Preferences systemRoot = Preferences.systemRoot();
...
WARNING: Could not open windows registry node Software\JavaSoft\Prefs at root 0x80000002
在当前的JDK实现中,systemRoot
等效于HKEY_LOCAL_MACHINE
(0x80000002
也是如此)。默认情况下,用户在不通过UAC的情况下没有写权限。
要解决此问题,最好将代码更改为使用Preferences.userRoot()
,该代码可以访问HKEY_CURRENT_USER
下的注册表节点,通常是可写的。