我们最近从 Update 21 更新到 Java 7 Update 25,并且现在在从 rmi 线程调用 SwingUtilities.isEventDispatchThread() 时遇到空指针异常,因为 AppContext.getAppContext() 返回 null。
java.lang.NullPointerException 位于
sun.awt.SunToolkit.getSystemEventQueueImplPP(来源未知)位于
sun.awt.SunToolkit.getSystemEventQueueImplPP(来源未知)位于
sun.awt.SunToolkit.getSystemEventQueueImpl(来源未知)位于
java.awt.Toolkit.getEventQueue(来源未知)位于
java.awt.EventQueue.isDispatchThread(来源未知)位于
javax.swing.SwingUtilities.isEventDispatchThread(来源未知)位于
...
...
在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 处
sun.reflect.NativeMethodAccessorImpl.invoke(来源未知)位于
sun.reflect.DelegatingMethodAccessorImpl.invoke(来源未知)位于
java.lang.reflect.Method.invoke(来源未知)位于
sun.rmi.server.UnicastServerRef.dispatch(来源未知)位于
sun.rmi.transport.Transport$1.run(来源不明)位于
sun.rmi.transport.Transport$1.run(来源不明)位于
java.security.AccessController.doPrivileged(本机方法)位于
sun.rmi.transport.Transport.serviceCall(来源未知)位于
sun.rmi.transport.tcp.TCPTransport.handleMessages(来源未知)位于
sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(未知
来源)于
sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(未知
来源)位于 java.util.concurrent.ThreadPoolExecutor.runWorker(未知
来源)位于 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知
来源)位于 java.lang.Thread.run(来源未知)
此错误仅在 Web 启动时出现,当我们通过 IDE 运行应用程序时,就没有问题。
还有其他人遇到过这个吗?您知道 AppContext 的最新更新中发生了什么变化吗?
更新后,其他人似乎遇到了与 AppContext 相关的问题:https://forums.oracle.com/message/11077767#11077767
我在 Java3D 作为 Java Web Start 运行时遇到了同样的问题。我找到了另一个解决方案。您必须准备自己的 InvokeLaterProcessor 和可运行队列。它必须扩展 Thread 并获取可运行对象并在 run 方法中处理它们:
public class InvokeLaterProcessor extends Thread {
private BlockingQueue<Runnable> queue=new ArrayBlockingQueue<Runnable>(1);
public InvokeLaterProcessor(String name) {
super(name);
}
public void invokeLater(Runnable runnable) {
try {
queue.put(runnable);
} catch (InterruptedException ex) {
log.warn("invokeLater interrupted");
}
}
public void run() {
Runnable runnable=null;
do {
try {
runnable = queue.take();
SwingUtilities.invokeLater(runnable);
} catch (InterruptedException ex) {
runnable=null;
}
} while(runnable!=null);
}
}
您所要做的就是在主线程中创建的某个类的静态中创建它:
static {
invokeLaterProcessor=new InvokeLaterProcessor("MyInvokeLater");
invokeLaterProcessor.start();
}
并通过以下代码处理可运行程序:
invokeLaterProcessor.invokeLater(runnable);
你不需要专有
sun.awt.SunToolkit.invokeLaterOnAppContext(evtContext, rn)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)