今天我花了一个下午分析 NoClassDefFoundError。一次又一次地验证classpath,结果发现有一个类的静态成员抛出了第一次被忽略的Exception。之后,每次使用该类都会抛出没有有意义的堆栈跟踪的 NoClassDefFoundError:
Exception in thread "main" java.lang.NoClassDefFoundError:
Could not initialize class InitializationProblem$A
at InitializationProblem.main(InitializationProblem.java:19)
就这样。没有更多的线条。
简而言之,这就是问题所在:
public class InitializationProblem {
public static class A {
static int foo = 1 / 0;
static String getId() {
return "42";
}
}
public static void main( String[] args ) {
try {
new A();
}
catch( Error e ) {
// ignore the initialization error
}
// here an Error is being thrown again,
// without any hint what is going wrong.
A.getId();
}
}
为了让它不那么容易,除了最后一个调用之外,所有的调用A.getId()
都隐藏在一个非常大的项目的初始化代码中的某个地方。
问题:
现在我在经过数小时的反复试验后发现了这个错误,我想知道是否有一种直接的方法可以从抛出的异常开始找到这个错误。关于如何做到这一点的任何想法?
我希望这个问题将成为其他分析莫名其妙的人的提示NoClassDefFoundError
。