非常奇怪NoClassDefFoundError

时间:2016-05-11 14:40:43

标签: java classloader

我遇到NoClassDefFoundError的情况。由于没有太多可用的信息,并且我100%肯定该类在那里,我使用Eclipse调试器进行了一些详细的测试:

  1. 以调试模式启动Java程序
  2. 当它停止(某处)时,我检查正在运行的线程的类路径(在调试模式下)。那里有“missing”类的目录,而.class文件也在那里。
  3. 在“表达式”窗口中,我添加了两个表达式:

    a)新的MyClass() - >导致NoClassDefFoundError

    b)MyClass.class - >显示类定义!?!?

  4. 我在MyClass的构造函数的第一行放了一个断点,它永远不会停在那里,所以从不调用构造函数...调用类上的私有静态final字段可以从调试窗口中运行...
  5. 怎么会这样?我还使用VisualVM查看了该过程,我可以看到“MyClass”定义。当班级在那里时会出现什么错误?

    我无法得到这个案例的一个小的可复制的例子,因为我不知道是什么原因造成的。类的单元测试可以实例化它,这种行为只发生在集成的上下文中。

2 个答案:

答案 0 :(得分:2)

我相信NoClassDefFoundError可能是由于链接问题造成的。当你这样做时:

MyClass.class

您正在加载类但未初始化它;这意味着不需要解析初始化中使用的引用。另一方面,当您创建实例时:

new MyClass()

...该类确实需要初始化,需要解析引用,并且您可以在那时获得失败 - 实际上您确实如此。对我来说,这意味着该类引用了另一个由于某种原因无法加载的类,或者该类的初始化失败(尽管后者通常会给出ExceptionInInitializerError)。

答案 1 :(得分:1)

如果在初始化class时出现故障,可能会发生这种情况,通常是exception中有static blocks,因此您应该检查所有static blocks以确保RuntimeException没有人抛出<div contenteditable="plaintext-only" id="mainDiv" onblur="func()"> </div>