调试时如何处理 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?的主要内容,如果未能解决你的问题,请参考以下文章