从JRE 1.7.0_21升级到1.7.0_25-b15后,我的应用程序在从Java WebStart运行时开始在SwingUtilities.invokeLater(...)中抛出NullPointerException.令人惊讶的是,当它作为一个独立的应用程序(在JWS之外)执行时,它运行良好.
这是堆栈的顶部:
Exception in thread "AWT-EventQueue-2" java.lang.NullPointerException
at sun.awt.SunToolkit.getSystemEventQueueImplPP(SunToolkit.java:1011)
at sun.awt.SunToolkit.getSystemEventQueueImplPP(SunToolkit.java:1007)
at sun.awt.SunToolkit.getSystemEventQueueImpl(SunToolkit.java:1002)
at java.awt.Toolkit.getEventQueue(Toolkit.java:1730)
at java.awt.EventQueue.invokeLater(EventQueue.java:1217)
at javax.swing.SwingUtilities.invokeLater(SwingUtilities.java:1290)
at AppletView$8.setBaseUnits(AppletView.java:536)
(...)
Run Code Online (Sandbox Code Playgroud)
为了全面了解:方法setBaseUnits(..)被远程服务器从RMI调用为回调.完整的堆栈跟踪很长.
安全模型中是否有某些内容在RMI或JWS中发生了变化,可能会破坏事物?如果是这样,我会期待一些安全性异常,但它可能是在JRE中未正确检测到的并导致NPE.
任何建议表示赞赏.
----更新1 :
JRE 1.7.0_25更新可能存在类似的问题,可能涉及一些安全更改和AppContext对象:https : //forums.oracle.com/message/11080621 https://forums.oracle.com/thread/2552799.我尝试过建议修复:https://forums.oracle.com/message/11082162#11082162但没有任何成功.
我可以在我的应用程序中看到3个AWT-EventQueue线程,数字从0到2.看起来如果JWS启动程序,JRE会为不同的应用程序上下文创建额外的事件队列.JWS中有3个AppContext和3个EVT,如果从IDE执行程序,则只有一个上下文和EVT.
----更新2 :
下面的guruman建议有一个解决方法(非常感谢).不幸的是,SwingUtilities.invokeLater(..)必须替换对来自RMI线程的所有调用,并且程序开始依赖于Sun JRE内部API.
我仍然在寻找更具体的方法,而不是针对Sun JRE.我认为这是一个JRE错误.也许它可以以某种方式修补:在RMI线程中AppContext不应为null.
----更新3:
我做了一个简单的测试用例来说明问题.它包含4个文件.要运行此测试用例,需要签署目标jar(TestCase.jar).首先在launch.jnlp中指定正确的代码库,然后通过Java Web Start运行服务器(例如,使用javaws launch.jnlp).屏幕上应显示以下框架:

然后可以执行RMI客户端.成功执行后,框架应包括:

但是如果您尝试使用JWS执行服务器您将在客户端程序中获得以下异常(异常从RMI服务器传播到RMI客户端):
Exception in thread "main" java.lang.NullPointerException
at sun.awt.SunToolkit.getSystemEventQueueImplPP(SunToolkit.java:1011)
at sun.awt.SunToolkit.getSystemEventQueueImplPP(SunToolkit.java:1007)
at sun.awt.SunToolkit.getSystemEventQueueImpl(SunToolkit.java:1002)
at java.awt.Toolkit.getEventQueue(Toolkit.java:1730)
at java.awt.EventQueue.invokeLater(EventQueue.java:1217)
at javax.swing.SwingUtilities.invokeLater(SwingUtilities.java:1290)
at testcase.RmiServiceImpl.callBack(RmiServiceImpl.java:70)
at …Run Code Online (Sandbox Code Playgroud) 自从Oracle推出的java 7更新25以来,我们的应用程序不再起作用.
最初,我们收到了一些关于Manifest文件中缺少的代码库和服务标签的警告,我们修复了该文件.
我们现在最终遇到的问题是在控制台中我们只得到以下几行:
#### Java Web Start Error:
#### null
Run Code Online (Sandbox Code Playgroud)
我们还得到一个应用程序错误对话框,其中包含以下消息:无法启动应用程序.
详细信息按钮在"例外"中提供以下详细信息:
java.lang.NullPointerException
at com.sun.jnlp.JNLPClassLoader.getPermissions(Unknown Source)
at java.security.SecureClassLoader.getProtectionDomain(SecureClassLoader.java:206)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at com.sun.jnlp.JNLPClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at desktop.DesktopProxySelector.<init>(DesktopProxySelector.java:24) <- code smippet below
at desktop.Main.main(Main.java:139) <- code smippet below
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.sun.javaws.Launcher.executeApplication(Unknown Source)
at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
at com.sun.javaws.Launcher.run(Unknown Source)
at java.lang.Thread.run(Thread.java:724)
Run Code Online (Sandbox Code Playgroud)
相关的代码部分是:
Desktop.Main.main …Run Code Online (Sandbox Code Playgroud)