Netbeans 8.2 设计器无法加载类



我正在使用 Netbeans 8.2 UI Builder/Designer (Matisse),并且有一些自定义小部件。 名为 ChoiceTab 的自定义小组件显示一个名为 Choice 的非 UI 对象。 当我单击一个名为HL7RuleAdd的类时,该类使用ChoiceTab并单击"设计",我收到以下错误:

ClassDefNotFoundException:
java.lang.NoClassDefFoundError: Could not initialize class com.hcs.orc.datatype.Choice
at com.hcs.orc.detail.ChoiceTab.<init>(ChoiceTab.java:58)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at java.lang.Class.newInstance(Class.java:442)
at org.netbeans.modules.form.CreationFactory.createDefaultInstance(CreationFactory.java:180)
at org.netbeans.modules.form.RADComponent.createBeanInstance(RADComponent.java:252)
at org.netbeans.modules.form.RADComponent.initInstance(RADComponent.java:191)
at org.netbeans.modules.form.GandalfPersistenceManager.restoreComponent(GandalfPersistenceManager.java:780)
at org.netbeans.modules.form.GandalfPersistenceManager.loadComponent(GandalfPersistenceManager.java:968)
at org.netbeans.modules.form.GandalfPersistenceManager.restoreComponent(GandalfPersistenceManager.java:824)
at org.netbeans.modules.form.GandalfPersistenceManager.loadComponent(GandalfPersistenceManager.java:968)
at org.netbeans.modules.form.GandalfPersistenceManager.restoreComponent(GandalfPersistenceManager.java:824)
at org.netbeans.modules.form.GandalfPersistenceManager.loadComponent(GandalfPersistenceManager.java:968)
at org.netbeans.modules.form.GandalfPersistenceManager.loadForm(GandalfPersistenceManager.java:503)
at org.netbeans.modules.form.GandalfPersistenceManager.loadForm(GandalfPersistenceManager.java:283)
at org.netbeans.modules.form.FormEditor$2.run(FormEditor.java:352)
at org.netbeans.modules.form.FormLAF$2.run(FormLAF.java:293)
at org.netbeans.modules.openide.util.NbMutexEventProvider$Event.doEventAccess(NbMutexEventProvider.java:138)
at org.netbeans.modules.openide.util.NbMutexEventProvider$Event.readAccess(NbMutexEventProvider.java:98)
at org.netbeans.modules.openide.util.LazyMutexImplementation.readAccess(LazyMutexImplementation.java:94)
at org.openide.util.Mutex.readAccess(Mutex.java:250)
at org.netbeans.modules.form.FormLAF.executeWithLookAndFeel(FormLAF.java:276)
at org.netbeans.modules.form.FormEditor.loadFormData(FormEditor.java:349)
at org.netbeans.modules.nbform.FormEditorSupport.loadOpeningForm(FormEditorSupport.java:461)
at org.netbeans.modules.nbform.FormDesignerTC.loadForm(FormDesignerTC.java:279)
at org.netbeans.modules.nbform.FormDesignerTC.access$300(FormDesignerTC.java:87)
at org.netbeans.modules.nbform.FormDesignerTC$PreLoadTask$1.run(FormDesignerTC.java:268)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:159)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

ChoiceTab 在三个不同的地方使用,所有这些地方都有这个问题,并且都属于同一个项目。

这很奇怪,因为com.hcs.orc.datatype.Choice与上面的ChoiceTab和HL7RuleAdd位于同一项目中。 更奇怪的是,Netbeans 在我的代码的一个分支中正常工作,但在另一个分支中因上述错误而失败。

下面是第 58 行和 ChoiceTab 构造函数的开头:

public ChoiceTab() {
initComponents();
DataFieldTraits trait = Choice.getFieldTraits(ORCConstants.DI_CHOICE_MNC, Choice.dinfo.getTraitsS());

如您所见,第 58 行,对 Choice 的引用是静态调用,用于获取有关 Choice 的其他信息。

这两个分支没有太大不同(最近的分支),所以我放弃了失败分支中的大部分更改,但它没有解决问题。 我查看了 IDE 日志窗口,除了上述错误之外没有发现任何其他内容。

ChoiceTab 已作为容器添加到 Netbeans 设计器组件面板中,但无论它是否位于组件面板中似乎没有区别。

我还尝试了清理和构建所有项目。 它的构建没有错误,但在 Netbeans 中仍然失败。

ChoiceTab本身是一个"设计"类,当您单击"设计"按钮时可以正常工作。

此外,尝试删除 Netbeans 缓存并重新启动 Netbeans。 这也没有解决问题。

我已经没有想法了,希望得到任何帮助。

在同事的帮助下,我能够追踪到问题。 长话短说,Choice 类具有在类加载时初始化的静态成员。 这些反过来调用其他静态方法,其中一个返回抽象工厂的单例。 但是,没有设置单例,因为具体实现是在应用程序启动时设置的(在此之前不可用)。 因此,工厂返回为 null,这导致了 NullPointerException 并导致 Choice 类无法加载。 然后,这个 NullPointerException 被误导性的 ClassDefNotFoundException 掩盖。

我们追踪问题的方法是将静态System.out.println(...)语句引入静态初始化的不同类中。 结合这一点,注释掉一些静态初始化代码,我们能够追踪问题。

我们的 System.out.println(...) 代码示例:

static {
System.out.println("Initializing Choice";
}

从命令行运行 Netbeans 并单击"设计"按钮时,我们可以看到打印语句并调试问题。

相关内容

  • 没有找到相关文章

最新更新