0

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

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 Designer Palette,但它是否在 Palette 中似乎并没有什么不同。

我也尝试过清理并构建所有项目。它构建没有错误,但在 Netbeans 中继续失败。

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

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

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

4

1 回答 1

1

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

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

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

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

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

于 2018-04-12T15:34:20.813 回答