如何在调试时处理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方法,它现在工作正常。
- 如何配置eclipse以自动刷新项目作为其构建的一部分?
- Eclipse不会在Linux Mint中打开,Java也不会在不同的目录中打开
- Eclipse Indigo – JPAvalidation问题
- eclipse没有validationstruts.xml文件
- 删除java文件中的所有类型的注释
- java.lang.ClassNotFoundException:javax.servlet.ServletContainerInitializer
- Eclipse自动完成不适用于lambda和类型
- 运行TestNG测试时出错
- Java的。 隐式超级构造函数Employee()未定义。 必须显式调用另一个构造函数