NoClassDefFoundError && ClassNotFoundException

Stella981
• 阅读 330

两种错误都是涉及类加载问题,类层次结构如下:

NoClassDefFoundError && ClassNotFoundException

NoClassDefFoundError是系统错误,ClassNotFoundException是系统异常,可以捕获。 NoClassDefFoundError发生在对Class原始文件解析通过类的全限定名在类路径下无法找到相关类的定义时;ClassNotFoundException发生在通过调用Class.forName()、类加载器的loadClass/findClass在程序中自定义加载类时。

  • 注: 以下测试代码文件夹层次结构: *

NoClassDefFoundError && ClassNotFoundException

下面为NoClassDefFoundError测试程序,TestReference.java程序内引用google.guava包里的第三方类。在编译时将第三方的guava-23.0.jar加入到classpath里,编译通过,运行时不加classpath,然后程序就会抛出NoClassDefFoundError,通过异常堆栈可以看出,底层也是通过loadClass来尝试加载引用的类的。

import com.google.common.base.*;
import com.google.common.collect.*;
import java.util.*;
public class TestReference{
  public static void main(String[] args){
    Map<String,String> a = Maps.newHashMap();
  }
}



javac -cp guava-23.0.jar TestReference.java
// 编译OK
java TestReference
// 报错:
// Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/col
// lect/Maps
//         at TestReference.main(TestReference.java:6)
// Caused by: java.lang.ClassNotFoundException: com.google.common.collect.Maps
//         at java.net.URLClassLoader.findClass(Unknown Source)
//         at java.lang.ClassLoader.loadClass(Unknown Source)
//         at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
//         at java.lang.ClassLoader.loadClass(Unknown Source)
//         ... 1 more
java TestReference -cp .;guava-23.0.jar
// 执行OK

通过研究Class文件结构可以得出以下结论: 当Java程序运行时,JVM加载TestReference.class文件,解析出methodRef下code属性里的代码内容,通过代码里写的类短名称加上import的空间定位引用类的全限定名,然后通过全限定名在类路径下加载相关的类,当没有找到时抛出该错误。这个错误是JVM抛出。

下面是ClassNotFoundException示例代码,ClassNotFoundException代码里通过Class.forName("") 加载google.guava的类:

public class TestClassForname{
  public static void main(String[] args) throws Exception{
      Class a = Class.forName("com.google.common.collect.Maps");
  }
}



javac TestClassForname.java
// 编译OK
java TestClassForname
// Exception in thread "main" java.lang.ClassNotFoundException: com.google.common.c
// ollect.Maps
//         at java.net.URLClassLoader.findClass(Unknown Source)
//         at java.lang.ClassLoader.loadClass(Unknown Source)
//         at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
//         at java.lang.ClassLoader.loadClass(Unknown Source)
//         at java.lang.Class.forName0(Native Method)
//         at java.lang.Class.forName(Unknown Source)
//         at TestClassForname.main(TestClassForname.java:4)

ClassNotFoundException这个异常的定义就是没有加载到类就抛出这个异常,上面说的NoClassDefFoundError底层也是通过抛出这个异常触发的,只不过JVM会在上面场合下通过捕获ClassNotFoundException然后转而抛出NoClassDefFoundError错误。

点赞
收藏
评论区
推荐文章
技术小男生 技术小男生
5个月前
linux环境jdk环境变量配置
1:编辑系统配置文件vi/etc/profile2:按字母键i进入编辑模式,在最底部添加内容:JAVAHOME/opt/jdk1.8.0152CLASSPATH.:$JAVAHOME/lib/dt.jar:$JAVAHOME/lib/tools.jarPATH$JAVAHOME/bin:$PATH3:生效配置
光头强的博客 光头强的博客
5个月前
Java面向对象试题
1、请创建一个Animal动物类,要求有方法eat()方法,方法输出一条语句“吃东西”。创建一个接口A,接口里有一个抽象方法fly()。创建一个Bird类继承Animal类并实现接口A里的方法输出一条有语句“鸟儿飞翔”,重写eat()方法输出一条语句“鸟儿吃虫”。在Test类中向上转型创建b对象,调用eat方法。然后向下转型调用eat()方
baskbull baskbull
1年前
Java的fail-fast机制究竟是什么?
failfast机制快速失败模块的职责是检测错误,然后让系统的下一个最高级别处理错误。一旦发生异常,直接停止并上报。尽最大努力去抛出异常。这样做的好处是可以预先识别出一些错误情况,但是它同样也可能会为我们带来一些问题。集合类的failfast机制当多个线程对部分集合进行结构上的改变操作,有可能会产生failfast机制,这时候会抛出ConcurrentM
刚刚好 刚刚好
5个月前
css问题
1、在IOS中图片不显示(给图片加了圆角或者img没有父级)<div<imgsrc""/</divdiv{width:20px;height:20px;borderradius:20px;overflow:h
小森森 小森森
5个月前
校园表白墙微信小程序V1.0 SayLove -基于微信云开发-一键快速搭建,开箱即用
后续会继续更新,敬请期待2.0全新版本欢迎添加左边的微信一起探讨!项目地址:(https://www.aliyun.com/activity/daily/bestoffer?userCodesskuuw5n)\2.Bug修复更新日历2.情侣脸功能大家不要使用了,现在阿里云的接口已经要收费了(土豪请随意),\\和注意
晴空闲云 晴空闲云
5个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
艾木酱 艾木酱
5个月前
快速入门|使用MemFire Cloud构建React Native应用程序
MemFireCloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
Stella981 Stella981
1年前
Invalid property 'driver' of bean class [org.apache.commons.dbcp.BasicDataSource]
Spring整合MyBatis!main方法测试,出现异常:!(https://oscimg.oschina.net/oscnet/up5532e35c99469d9cfcd2bec483942cb367e.png)一堆错,很懵逼!别慌,慢慢分析,也许错误很简单;先分析一下applicationContext.xml文件
Wesley13 Wesley13
1年前
Java 的Throwable、error、exception的区别
1.  什么是异常?异常本质上是程序上的错误,包括程序逻辑错误和系统错误。比如使用空的引用(NullPointerException)、数组下标越界(IndexOutOfBoundsException)、内存溢出错误等。Throwable类是Java语言中所有错误或异常的超类。有两个重要的子类:Exception(异常)和Error(错误),
Stella981 Stella981
1年前
Spring Boot 项目本地运行无异常,部署到 Linux 服务器运行报错:java.lang.ClassNotFoundException
SpringBoot项目本地运行无异常,部署到Linux服务器运行报错:java.lang.ClassNotFoundException参考文章:(1)SpringBoot项目本地运行无异常,部署到Linux服务器运行报错:java.lang.ClassNotFoundException(https://www.oschi
helloworld_28799839 helloworld_28799839
5个月前
常用知识整理
Javascript判断对象是否为空jsObject.keys(myObject).length0经常使用的三元运算我们经常遇到处理表格列状态字段如status的时候可以用到vue