¿Cómo trato con una ClassNotLoadedException durante la depuración?

Así que estoy (remotamente) depurando una aplicación java / jboss en Eclipse, caminando línea por línea. En un punto, una matriz de objetos GridSquare ( GridSquare es una clase independiente bastante simple, contiene algunas propiedades y métodos) se crea mediante una llamada a un método, es decir:

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

… Mientras que cuando realmente ejecuto el código, la matriz de squares se llena con objetos de 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 posterior a la asignación que se muestra arriba, si trato de ver la matriz de squares , en lugar de un valor, obtengo 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?

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 recomstackr 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).

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 stack 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.

He visto esto suceder en Eclipse cuando tienes las 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; } 
 //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 

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

Me enfrenté al mismo problema, acabo de crear un método principal de vacío estático público, un objeto creado del mismo tipo y la aplicación Ejecutar como Java, luego eliminé el método principal, ahora funciona bien.