2009-09-02 13 views
21

Así que estoy depurando (remotamente) una aplicación java/jboss en Eclipse, avanzando línea por línea. En un punto, una matriz de GridSquare objetos (GridSquare es una clase bastante simple, independiente, contiene algunas propiedades y métodos) es creado por una llamada de método, es decir:¿Cómo manejo una ClassNotLoadedException durante la depuración?

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

... Mientras que cuando En realidad, ejecuto el código, la matriz squares se llena con objetos GridSquare, obtengo algo extraño cuando paso por el código y la depuración. En un punto de interrupción en la línea inmediatamente después de la asignación se muestra arriba, si trato de ver la matriz squares, en lugar de un valor me sale esto:

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

... Alguien sabe de qué se trata?

Respuesta

20

Básicamente significa que el cargador de clases no ha cargado la clase GridSquare []. Dicho esto, suena como un error en el depurador de alguna manera. La asociación del punto de interrupción con el código parece estar ligeramente rota. O necesita recompilar para sincronizar los números de línea o está ocurriendo algún otro problema. En ese punto en el código (después de la asignación) necesita ser cargado. A menos que getSquares realmente devuelva una subclase (GridSquareSubclass []) en cuyo momento la JVM puede no haberla cargado porque no la necesita (todavía).

+0

¿Hay alguna manera de forzar a la JVM a cargar una clase en un momento determinado? ¿Algo similar a una directiva de compilación? – DanM

+13

Puede cargar la clase en su código solo para forzarlo a pasar (como tener una línea que cargue explícitamente la clase, como crear una nueva matriz del tipo la línea anterior). También podría intentar enviar una directiva a través de la expresión de evaluación en el depurador. (Como un Class.forName() o Array.newInstance()) – Yishai

+0

Eso lo hizo. ¡¡Gracias!! – DanM

0

He visto esto suceder en Eclipse cuando tienes variables de clase de una subclase que oculta las variables de una clase padre. De alguna manera, eso confunde a Eclipse (y en general es una mala idea). Por ejemplo:

class A { 
    private String a; 
} 

class B extends A { 
    public String a; 
} 
-3

que enfrentan el mismo problema, acabo de crear un método public static void main, objeto creado de mismo tipo y se ejecuta como aplicación Java, i luego se retira método principal, que ahora funciona bien.

-1

Al inicializar GridSquare se resolverá el problema. squares = new GridSquare();

0
//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); 
} 
1

Me encontré con este error porque estaba ejecutando una prueba de unidad en el código que utiliza la reflexión. Hice una clase especial para probar todas las características del código. Junit aparentemente usa un cargador de clases separado para las clases de prueba (lo cual tiene perfecto sentido) entonces mi código no pudo usar la reflexión en esa clase. El seguimiento de la pila que obtuve fue extremadamente genérico (java.lang.InstantiationException) pero cuando revisé el modo de depuración, encontré más detalles sobre el objeto Exception (org.eclipse.debug.core.DebugException: com.sun.jdi.ClassNotLoadedException) lo que me llevó a esta conclusión.

Así que moví la clase especial al cargador de clases principal (moviendo el archivo de src/test/java a src/main/java) y funcionó bien. No me gusta esta solución, pero no puedo encontrar una alternativa. En mi caso, no es gran cosa, pero puedo ver cómo esto puede ser una preocupación para los demás.

Cuestiones relacionadas