问题出现的原因: 虽然在IDE中的目录结构下有相关的.class文件,但是由于由于在根类加载器的类加载目录下放置了部分.class文件,但不是全部.class文件,所以报错。
解决途径:
案例详细: 根类加载器的有效目录:
public static void main(String[] args) { System.out.println("根加载器加载的Jar包的存放物理地址:"+System.getProperty("sun.boot.class.path")); }
控制台输出:
根加载器的存储路径:C:\Program Files\Java\jdk1.8.0_211\jre\lib\resources.jar; C:\Program Files\Java\jdk1.8.0_211\jre\lib\rt.jar; C:\Program Files\Java\jdk1.8.0_211\jre\lib\sunrsasign.jar; C:\Program Files\Java\jdk1.8.0_211\jre\lib\jsse.jar; C:\Program Files\Java\jdk1.8.0_211\jre\lib\jce.jar; C:\Program Files\Java\jdk1.8.0_211\jre\lib\charsets.jar; C:\Program Files\Java\jdk1.8.0_211\jre\lib\jfr.jar; C:\Program Files\Java\jdk1.8.0_211\jre\classes
我仅在目录:C:\Program Files\Java\jdk1.8.0_211\jre\classes下放置了MyTest.class文件。MyTest,java文件如下:
public class MyTest1 { public static void main(String[] args) { System.out.println(MyChild1.str); } } class MyParent1 { public static String str = "hello world"; static { System.out.println("MyParent static block."); } } class MyChild1 extends MyParent1 { static { System.out.println("MyChild1 static block."); } }
MyTest1 其引用了MyParent1以及MyChild1。 当前目录下仅仅只有:MyTest1.class文件,所以执行MyTest1.java中的main方法,报错:
Exception in thread "main" java.lang.NoClassDefFoundError: classloader/MyChild1 at classloader.MyTest1.main(MyTest1.java:11)
采用下面两个方法解决了这个异常。
结论: 要注意命名空间、类加载器双亲委托机制以及加载路径的关系。
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句