今日は、午後にNoClassDefFoundErrorの分析に費やしました。クラスパスを何度も確認した後、最初に無視された例外をスローしたクラスの静的メンバーが存在することが判明しました。その後、クラスを使用するたびに、意味のあるスタックトレースなしで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
。