专栏首页渔夫记录一个我所遇到的 java.lang.NoClassDefFoundError 异常

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

问题出现的原因: 虽然在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文件)

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 第一章 类加载到卸载的全过程分析

     在Java代码中,类型的加、连接与初始化过程都是在程序运行期间完成的。其中类型指我们定义的一个class、interface、enum,此时并未包含对象。这一...

    Fisherman渔夫
  • 计算机语言的分类

     到目前为止,我自己学过或者说碰过的语言有 C、Java、JavaScript、Python、Go。最近在学的是 Go,看到 Go meta描述是:静态、编译型...

    Fisherman渔夫
  • 什么是递归--What does resursion mean?

    在Google.com.hk或者在Google.com上搜索 递归或者recursion 发现Google“抽了”,明明搜索正确,为啥还显示一个查询错误的提示?...

    Fisherman渔夫
  • JVM - 类加载过程

    当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。

    用户2987604
  • 类加载器ClassLoader

    上篇文章说到,Class类可以通过一个类的全限定名去加载类,那么底层是如何去加载的呢?这就是我们今天要聊的类加载器ClassLoader,其可以通过一个类的全限...

    Liusy
  • mint-ui loadmore 采坑指南

    loadmore的部分主要是mint-ui用来解决上拉以及下拉的部分,用来做加载更多数据或者刷新的部分。

    RobinsonZhang
  • Android Loader 机制,让你的数据加载更加轻松

    在 Android 中,任何耗时的操作都不能放在 UI 线程中,所以耗时的操作都需要使用异步加载来实现。其实,加载耗时数据的常用方式其实也挺多的,就让我们来看一...

    developerHaoz
  • 2017年高频率的互联网校园招聘面试题

    参加了2017年校招,面试了阿里、百度、腾讯、滴滴、美团、网易、去哪儿等公司,个人是客户端 Android 方向,总结了面试过程中频率出现较高的题目,希望对大家...

    哲洛不闹
  • 三分钟浅谈TT猫的前端优化

    以上参数是在CTRL+F5下测试的,也就是说不存在浏览器本地缓存一说,DOM渲染时间为1.42s,整个页面load时间为2.31s。

    小柒2012
  • 面试必问:JVM类加载机制详细解析

    在Java面试中,简历上有写JVM(Java虚拟机)相关的东西,JVM的类加载机制基本是面试必问的知识点。

    程序员追风

扫码关注云+社区

领取腾讯云代金券