如何在调试时处理ClassNotLoadedException?

所以我(远程)调试Eclipse中的java / jboss应用程序,逐行执行。 有一次,一个GridSquare对象数组( GridSquare是一个相当简单的独立类,包含一些属性和方法)是由方法调用创建的,即:

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

…当我实际执行代码时, GridSquare数组确实填充了GridSquare对象,在单步执行代码和调试时,我得到了一些奇怪的东西。 在紧跟上面显示的赋值之后的行上的断点处,如果我尝试查看squares数组,而不是值,我得到:

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

……任何人都知道那是什么意思?

基本上它意味着类加载器没有加载GridSquare []类。 据说这在某种程度上听起来像调试器中的错误。 断点与代码的关联似乎有点破碎。 您需要重新编译以使行号同步或其他问题正在进行中。 在代码中的那一点(在赋值之后),它需要被加载。 除非getSquares实际返回一个子类(GridSquareSubclass []),否则JVM可能没有加载它,因为它还不需要它(尚未)。

我遇到了这个错误,因为我在使用reflection的代码上运行unit testing。 我做了一个特殊的类来测试代码的所有function。 Junit显然在测试类中使用了一个单独的类加载器(这非常有意义),所以我的代码无法在该类上使用reflection。 我得到的堆栈跟踪非常通用(java.lang.InstantiationException)但是当我在调试模式下检查时,Exception对象本身有更多细节(org.eclipse.debug.core.DebugException:com.sun.jdi.ClassNotLoadedException)这让我得出了这个结论。

所以我将特殊类移动到主类加载器(通过将文件从src / test / java移动到src / main / java),它运行正常。 我不喜欢这个解决方案,但我无法找到替代方案。 在我的情况下,这不是什么大问题,但我可以看到这可能是其他人的关注。

我已经看到,当你有一个子类的类变量隐藏父类的变量时,会发生这种情况。 某种程度上混淆了Eclipse(无论如何通常都是一个坏主意:)。 例如:

 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 

通过初始化GridSquare将解决问题。 squares = new GridSquare();

我遇到了同样的问题,我刚刚创建了一个public static void main方法,创建了相同类型的对象和Run As java Application,然后我删除了main方法,它现在工作正常。