调试时如何处理 ClassNotLoadedException?

Posted

技术标签:

【中文标题】调试时如何处理 ClassNotLoadedException?【英文标题】:How do I deal with a ClassNotLoadedException while debugging? 【发布时间】:2010-11-24 23:03:51 【问题描述】:

所以我正在(远程)在 Eclipse 中调试一个 java/jboss 应用程序,逐行执行。有一次,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.

...有人知道这是怎么回事吗?

【问题讨论】:

【参考方案1】:

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

所以我将特殊类移动到主类加载器(通过将文件从 src/test/java 移动到 src/main/java)并且它运行良好。我不喜欢这个解决方案,但我无法找到替代方案。就我而言,这没什么大不了的,但我可以看到这对其他人来说可能是一个问题。

【讨论】:

【参考方案2】:
//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);

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

我遇到了同样的问题,我刚刚创建了一个 public static void main 方法,创建了相同类型的对象并运行为 java 应用程序,然后我删除了 main 方法,它现在可以正常工作了。

【讨论】:

【参考方案5】:

当您有一个子类的类变量隐藏父类的变量时,我已经在 Eclipse 中看到了这种情况。不知何故,这使 Eclipse 感到困惑(无论如何通常都是一个坏主意:)。例如:

class A 
   private String a;


class B extends A 
   public String a;

【讨论】:

【参考方案6】:

基本上这意味着类加载器没有加载 GridSquare[] 类。话虽这么说,这在某种程度上听起来像是调试器中的一个错误。与代码的断点关联似乎略有破坏。您需要重新编译以使行号同步,或者出现其他问题。在代码中的那个点(在分配之后)需要加载它。除非 getSquares 实际上返回一个子类 (GridSquareSubclass[]),此时 JVM 可能还没有加载它,因为它(还)不需要它。

【讨论】:

有没有办法强制 JVM 在特定时刻加载一个类?类似于编译器指令的东西? 您可以在代码中加载该类,只是为了强制它发生(例如有一行显式加载该类,例如创建前一行类型的新数组)。您还可以尝试通过调试器中的评估表达式发送指令。 (如 Class.forName() 或 Array.newInstance()) 能指导一下***.com/questions/39550128/…吗?

以上是关于调试时如何处理 ClassNotLoadedException?的主要内容,如果未能解决你的问题,请参考以下文章

执行 Flux.map() 时如何处理错误

制作决策树时如何处理数据

使用 ActiveMerchant 时如何处理超时?

使用 QNetworkAccessManager 时如何处理代理

使用 UIKeyCommand 时如何处理大小写字符

使用 Envers 时如何处理 Flyway 迁移?