Netbeans 8.2 Designer无法加载类

时间:2018-04-11 22:36:46

标签: java netbeans matisse

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

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 Log窗口,除上述错误外没有找到任何其他内容。

ChoiceTab已作为容器添加到Netbeans Designer Palette中,但如果它位于Palette中,它似乎没有区别。

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

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

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

我已经没有想法了,也会感激任何帮助。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

从命令行运行Netbeans并单击&#34; Design&#34;按钮,我们可以看到我们的打印语句并调试问题。