web-dev-qa-db-ja.com

デバッグ中にClassNotLoadedExceptionを処理するにはどうすればよいですか?

だから私は(リモートで)EclipseでJava/jbossアプリケーションをデバッグし、1行ずつステップ実行します。ある時点で、GridSquareオブジェクトの配列(GridSquareはかなり単純なスタンドアロンクラスで、いくつかのプロパティとメソッドが含まれます)がメソッド呼び出しによって作成されます。

GridSquare[] squares = this.theGrid.getSquares(14, 18, 220, 222);

...実際にコードを実行すると、squares配列にGridSquareオブジェクトが入力されますが、コードをステップ実行してデバッグすると奇妙なことが発生します。上記の割り当ての直後の行のブレークポイントで、値の代わりにsquares配列を表示しようとすると、次のようになります。

org.Eclipse.debug.core.DebugException: com.Sun.jdi.ClassNotLoadedException: Type has not been loaded occurred while retrieving component type of array.

...誰がそれが何を意味するのか知っていますか?

26
DanM

基本的には、クラスローダーがGridSquare []クラスをロードしていないことを意味します。とはいえ、それは何らかの形でデバッガのバグのように聞こえます。コードとブレークポイントの関連付けがわずかに壊れているようです。行番号を同期させるために再コンパイルする必要があるか、他の問題が発生しています。コードのその時点で(割り当て後)、ロードする必要があります。 getSquaresが実際にサブクラス(GridSquareSubclass [])を返す場合を除き、その時点ではJVMは(まだ)必要ないためにそれをロードしていない可能性があります。

25
Yishai

リフレクションを使用するコードで単体テストを実行していたため、このエラーに遭遇しました。コードのすべての機能をテストするための特別なクラスを作成しました。 Junitはテストクラス用に別のクラスローダーを使用しているようです(これは理にかなっています)ので、私のコードはそのクラスでリフレクションを使用できませんでした。取得したスタックトレースは非常に汎用的(Java.lang.InstantiationException)でしたが、デバッグモードでチェックすると、Exceptionオブジェクト自体の詳細がありました(org.Eclipse.debug.core.DebugException:com.Sun.jdi.ClassNotLoadedException)この結論に至りました。

そのため、特別なクラスをメインのクラスローダーに移動し(ファイルをsrc/test/Javaからsrc/main/Javaに移動)、正常に動作しました。私はこの解決策が好きではありませんが、代替案を見つけることができません。私の場合、それは大したことではありませんが、他の人にとってこれがどのように懸念されるかを見ることができます。

1
James Watkins

親クラスの変数を隠しているサブクラスのクラス変数があるときに、Eclipseでこれが発生するのを見てきました。どういうわけかそれはEclipseを混乱させます(とにかく一般的に悪い考えです:)。例えば:

class A {
   private String a;
}

class B extends A {
   public String a;
}
0
studgeek
//Give a SIZE to the array:
GridSquare[] squares = GridSquare[this.theGrid.size()];

//Fill each element of the array with the object constructor to avoid the null value
for(int i=0; i<this.theGrid.size(); i++){
    squares[i] = new GridSquare();
    squares[i] = this.theGrid.getSquares(14, 18, 220, 222);
}
0
juldeh