2016-05-11 141 views
0

我有一种情况,我得到一个NoClassDefFoundError。由于没有太多的资料,我100%肯定,类是存在的,我做了Eclipse调试器的一些详细的测试:非常奇怪NoClassDefFoundError

  1. 启动Java程序在调试模式下
  2. 当它停(地方) ,我检查正在运行的线程的类路径(在调试模式下)。 “missing”类的目录就在那里,而.class文件也在那里。
  3. 在表达式窗口,我想补充两个表达式:

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

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

  4. 我把一个断点放在MyClass构造函数的第一行,它永远不会停在那里,所以构造函数永远不会被调用......调用类的私有静态最终字段从调试窗口工作...

这怎么可能?我还用VisualVM窥视了这个过程,我可以看到“MyClass”定义。课堂上有什么会导致这样的错误?

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

+0

分享一些你得到这个错误的代码。 – 11thdimension

+2

如果在初始化类时发生故障,通常当我们在静态块中出现异常时,可能会发生这种情况,请检查所有静态块 –

+0

@NicolasFilotto,这正是原因......有一个调用Spring Bean一个静态初始化器... – Martin

回答

1

如果在初始化class故障可能出现这种情况,通常当我们在static blocksexception所以你应该检查所有的static blocks,以确保他们没有抛出RuntimeException

+0

这个问题的烦人的部分是,静态块中异常的Stacktrace并不总是显示...你只会看到NoClassDefFoundError ...这是一个令人沮丧的情况来分析... – Martin

+0

是的,我知道,它总是很难找到,这就是为什么我们需要最安全地保护我们执行的代码的原因静态块 –

+0

...或者干脆避免在静态块中访问外部依赖... :) – Martin

2

我相信NoClassDefFoundError可能是由于联系问题。当你这样做:

MyClass.class

您是装载类,但不进行初始化;这意味着初始化中使用的引用不需要解析。在另一方面,当你创建一个实例:

new MyClass()

...确实需要初始化类,引用需要解决的问题,你可以得到在这一点上失败 - 这的确是你做的。对我来说,这意味着这个类引用了另一个不能由于某种原因被加载的类,或者类的初始化失败(尽管后者通常给出ExceptionInInitializerError)。

+0

是的,我怀疑类似的东西。但是如何找出缺失的东西呢? Eclipse在Workspace中没有错误,项目构建得很好... – Martin

+1

@Martin捕获错误“getCause()”,打印原因的堆栈跟踪 - 也许。 :) 祝你好运。 – davmac