如何在调试时处理ClassNotLoadedException?

时间:2009-09-02 13:37:43

标签: java eclipse debugging remote-debugging

所以我(远程)调试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.

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

6 个答案:

答案 0 :(得分:25)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

class A {
   private String a;
}

class B extends A {
   public String a;
}

答案 3 :(得分: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);
}

答案 4 :(得分:-1)

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

答案 5 :(得分:-3)

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