我的数百名用户中只有一个无法启动我的 Java 桌面应用程序。对他来说只有大约三分之一的时间才开始。另外三分之二的时间在启动时抛出 NullPointerException:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at java.util.Hashtable.put(Hashtable.java:394)
at javax.swing.JEditorPane.registerEditorKitForContentType(JEditorPane.java:1327)
at javax.swing.JEditorPane.registerEditorKitForContentType(JEditorPane.java:1309)
at javax.swing.JEditorPane.loadDefaultKitsIfNecessary(JEditorPane.java:1387)
at javax.swing.JEditorPane.getKitTypeRegistry(JEditorPane.java:1344)
at javax.swing.JEditorPane.getEditorKitClassNameForContentType(JEditorPane.java:1340)
at javax.swing.JTextPane.<init>(JTextPane.java:76)
at myapp.Launcher$1.run(Launcher.java:13)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:633)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
我按照堆栈跟踪发现原因是
Thread.currentThread().getContextClassLoader()
在 JEditorPane 中返回 null。
谷歌搜索显示,这是一个影响少数人的零星、非常罕见且神秘的问题。
我的问题是,作为解决方法,我能做些什么?如果我在创建 EditorPane 之前调用它,这可能会起作用:
Thread.currentThread().setContextClassLoader(MyClass.class.getClassLoader());
但我并不像我想要的那样真正理解类加载器(我试图更好地理解它们)。我觉得在 EDT 中更改 contextClassLoader 可能会产生不好的后果。
有什么想法我能做什么?
编辑:我与非常了解 Java 类加载器的人有一些通信。这似乎是一个模糊的 ClassLoader 竞争条件。也就是说,Java 中的一个错误。