非常奇怪的 NoClassDefFoundError
Very weird NoClassDefFoundError
我遇到了一个 NoClassDefFoundError 错误。由于可用信息不多,而且我 100% 肯定 class 在那里,我使用 Eclipse 调试器进行了一些详细测试:
- 在调试模式下启动Java程序
- 当它停止(某处)时,我检查 运行 线程的 class 路径(在调试模式下)。 "missing"class的目录在那里,.class文件也在
在表达式window中,我添加了两个表达式:
a) new MyClass() --> 导致 NoClassDefFoundError
b) MyClass.class -> 显示 Class 定义!?!?
- 我在 MyClass 的构造函数的第一行下了一个断点,它永远不会停在那里,所以永远不会调用构造函数... Calling private static final fields on the class ] 从调试开始工作 Window...
怎么可能?我还用 VisualVM 监视了这个过程,我可以看到 "MyClass" 定义。当 class 存在时,什么会导致这样的错误?
我无法得到这种情况的可复制的小例子,因为我不知道是什么原因造成的。 class 的单元测试可以实例化它,这种行为只发生在集成上下文中。
我认为 NoClassDefFoundError
可能是由于链接问题。当你这样做时:
MyClass.class
您正在加载 class 但未对其进行初始化;这意味着不需要解析初始化中使用的引用。另一方面,当您创建实例时:
new MyClass()
... class 确实需要初始化,需要解析引用,此时您可能会失败 - 确实如此。对我来说,这意味着 class 指的是另一个 class 由于某种原因无法加载,或者 class 的初始化失败(尽管后者通常给出 ExceptionInInitializerError
代替)。
如果在初始化 class
时出现故障,通常会发生这种情况,通常是当我们在 static blocks
中有一个 exception
时,因此您应该检查所有 static blocks
确保其中 none 抛出 RuntimeException
.
我遇到了一个 NoClassDefFoundError 错误。由于可用信息不多,而且我 100% 肯定 class 在那里,我使用 Eclipse 调试器进行了一些详细测试:
- 在调试模式下启动Java程序
- 当它停止(某处)时,我检查 运行 线程的 class 路径(在调试模式下)。 "missing"class的目录在那里,.class文件也在
在表达式window中,我添加了两个表达式:
a) new MyClass() --> 导致 NoClassDefFoundError
b) MyClass.class -> 显示 Class 定义!?!?
- 我在 MyClass 的构造函数的第一行下了一个断点,它永远不会停在那里,所以永远不会调用构造函数... Calling private static final fields on the class ] 从调试开始工作 Window...
怎么可能?我还用 VisualVM 监视了这个过程,我可以看到 "MyClass" 定义。当 class 存在时,什么会导致这样的错误?
我无法得到这种情况的可复制的小例子,因为我不知道是什么原因造成的。 class 的单元测试可以实例化它,这种行为只发生在集成上下文中。
我认为 NoClassDefFoundError
可能是由于链接问题。当你这样做时:
MyClass.class
您正在加载 class 但未对其进行初始化;这意味着不需要解析初始化中使用的引用。另一方面,当您创建实例时:
new MyClass()
... class 确实需要初始化,需要解析引用,此时您可能会失败 - 确实如此。对我来说,这意味着 class 指的是另一个 class 由于某种原因无法加载,或者 class 的初始化失败(尽管后者通常给出 ExceptionInInitializerError
代替)。
如果在初始化 class
时出现故障,通常会发生这种情况,通常是当我们在 static blocks
中有一个 exception
时,因此您应该检查所有 static blocks
确保其中 none 抛出 RuntimeException
.