如何在调试时处理 ClassNotLoadedException?

2022-09-01 14:41:58

因此,我正在(远程)调试Eclipse中的java / jboss应用程序,逐行执行。在某一点上,一个对象数组(是一个相当简单的独立类,包含一些属性和方法)是由方法调用创建的,即:GridSquareGridSquare

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

...虽然当我实际执行代码时,数组确实填充了对象,但在逐步执行代码和调试时,我会遇到一些奇怪的事情。在上面所示的赋值之后的行上的断点处,如果我尝试查看数组,而不是值,我得到这个:squaresGridSquaresquares

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

...有人知道这是关于什么的吗?


答案 1

基本上,这意味着类装入器尚未装入 GridSquare[] 类。话虽如此,这听起来像是调试器中的错误。与代码的断点关联似乎略有中断。要么您需要重新编译以使行号同步,要么发生了其他问题。在代码中的这一点(在赋值之后),它需要被加载。除非 getSquares 实际上返回一个子类(GridSquareSubclass[]),此时 JVM 可能尚未加载它,因为它(还)不需要它。


答案 2

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

所以我将特殊类移动到主类加载器(通过将文件从src/test/java移动到src/main/java),它工作正常。我不喜欢这个解决方案,但我想不出替代方案。就我而言,这没什么大不了的,但我可以看到这可能是其他人的担忧。