不知道现在有没有和敝司一样,每次的发版是将本次更改过的代码编译后,将class文件打包到一个压缩包中去替换线上文件的,然后我经常会漏掉文件,也挺无语的
这次到测试环境,项目一启动,功能测试到某个模块,报了个NoClassDefFoundError
行吧,就说说ClassNotFoundException和NoClassDefFoundError的区别吧
先看看这俩的定义
ClassNotFoundException
当应用程序试图使用以下方法通过字符串名加载类时,抛出该异常:
- Class 类中的 forName 方法。
- ClassLoader 类中的 findSystemClass 方法。
- ClassLoader 类中的 loadClass 方法。
但是没有找到具有指定名称的类的定义。从 1.4 版本开始,此异常已经更新,以符合通用的异常链机制。在构造时提供并通过 getException() 方法访问的“加载类时引发的可选异常”,现在被称为原因,它可以通过 Throwable.getCause() 方法以及与上面提到的“遗留方法”来访问。
NoClassDefFoundError
当 Java 虚拟机或 ClassLoader 实例试图在类的定义中加载(作为通常方法调用的一部分或者作为使用 new 表达式创建的新实例的一部分),但无法找到该类的定义时,抛出此异常。
当前执行的类被编译时,所搜索的类定义存在,但无法再找到该定义。
概括地来说,当加载时无法从外存中找到class文件,则抛出ClassNotFoundException;而当连接时无法从内存中获得class则抛出NoClassDefFoundError。