首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >记录一个我所遇到的 java.lang.NoClassDefFoundError 异常

记录一个我所遇到的 java.lang.NoClassDefFoundError 异常

作者头像
Fisherman渔夫
发布2020-02-19 11:49:30
6010
发布2020-02-19 11:49:30
举报
文章被收录于专栏:渔夫渔夫

问题出现的原因: 虽然在IDE中的目录结构下有相关的.class文件,但是由于由于在根类加载器的类加载目录下放置了部分.class文件,但不是全部.class文件,所以报错。

解决途径:

  1. 删除相关根类加载器的目录结构
  2. 在根类加载器的目录结构下放置全部相关的.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)

采用下面两个方法解决了这个异常。

  1. 删除相关根类加载器的目录结构
  2. 在根类加载器的目录结构下放置全部相关的.class文件(此例中为MyParent1以及MyChild1的class文件)

结论: 要注意命名空间、类加载器双亲委托机制以及加载路径的关系。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档