ClassNotFoundException和NoClassDefFoundError

Stella981
• 阅读 319

定义:

对于术语的定义,最原汁原味的还是官方文档。

关于ClassNotFoundExceptionJavaDoc里这么描述:

Thrown when an application tries to load in a class through its string name using:

  • The forName method in class Class.
  • The findSystemClass method in class ClassLoader .
  • The loadClass method in class ClassLoader.

but no definition for the class with the specified name could be found.

关于NoClassDefFoundErrorJavaDoc里这么描述:

Thrown if the Java Virtual Machine or a ClassLoader instance tries to load in the definition of a class (as part of a normal method call or as part of creating a new instance using the new expression) and no definition of the class could be found.

The searched-for class definition existed when the currently executing class was compiled, but the definition can no longer be found.


样例:

如果只看官方定义,不容易明白(我就是这样的),看例子:

public class A {
    public static void main(String[] args) {
        try {
            B b = new B(); //NoClassDefFoundError
        } catch(Throwable e) {
            e.printStackTrace();
        }
        System.out.println("----------------------------");
        try {
            Class b = Class.forName("B");//ClassNotFoundException
        } catch (Throwable e) {
            e.printStackTrace();
        }
        System.out.println("----------------------------");
        try {
            ClassLoader loader = A.class.getClassLoader();
            loader.loadClass("B");//ClassNotFoundException
        } catch(Throwable e) {
            e.printStackTrace();
        }
    }
}

class B {
    
}

这里定义了两个类A和B,其中在A中的main方法中使用了B。

如果使用Eclipse工具编写这个类,编写完按下保存后,Eclipse会自动编译这两个类生成A.class和B.class。

如果使用cmd命令行,则需要手动编译这两个类。

接下来,我们把编译好的B.class手动删掉,之后再执行A的main方法:

ClassNotFoundException和NoClassDefFoundError

可以看到,new B()这一句抛出了NoClassDefFoundError,而Class.forName("B")和ClassLoader.loadClass("B")这两句则抛出了ClassNotFoundException。

原因就是JavaDoc里提到的:当使用类名字符串去调用Class.forName等方法来加载一个类时,如果找不到这个类,则抛出ClassNotFoundException。如果JVM尝试去加载一个类(普通方法调用或者使用new关键字创建对象),而这个类又不存在时,则抛出NoClassDefFoundError。


区别:

一个是Error,一个是Exception。

通过类名,手动调用方法去加载不存在的类,抛出ClassNotFoundException;而如果是JVM调用方法加载不存在的类,抛出NoClassDefFoundError。


总结:

ClassNotFoundException :
Thrown when an application tries to load in a class through its name, but no definition for the class with the specified name could be found

NoClassDefFoundError :
Thrown if the Java Virtual Machine tries to load in the definition of a class and no definition of the class could be found.


参考:

http://stackoverflow.com/questions/1457863/what-causes-and-what-are-the-differences-between-noclassdeffounderror-and-classn

http://www.javaroots.com/2013/02/classnotfoundexception-vs.html

点赞
收藏
评论区
推荐文章
刚刚好 刚刚好
4个月前
css问题
1、在IOS中图片不显示(给图片加了圆角或者img没有父级)<div<imgsrc""/</divdiv{width:20px;height:20px;borderradius:20px;overflow:h
小森森 小森森
4个月前
校园表白墙微信小程序V1.0 SayLove -基于微信云开发-一键快速搭建,开箱即用
后续会继续更新,敬请期待2.0全新版本欢迎添加左边的微信一起探讨!项目地址:(https://www.aliyun.com/activity/daily/bestoffer?userCodesskuuw5n)\2.Bug修复更新日历2.情侣脸功能大家不要使用了,现在阿里云的接口已经要收费了(土豪请随意),\\和注意
晴空闲云 晴空闲云
4个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
艾木酱 艾木酱
3个月前
快速入门|使用MemFire Cloud构建React Native应用程序
MemFireCloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
Stella981 Stella981
1年前
Spring Security学习
GettingStart官方文档学习SpringSecurityReference(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fdocs.spring.io%2Fspringsecurity%2Fsite%2Fdocs%2F
Stella981 Stella981
1年前
Linux系统小技巧(4):环境变量JAVA_TOOL_OPTIONS简介
_摘要:_ 对于通过JNI使用Java的应用,比如使用JNI来调用JVM。给JVM传递参数,环境变量JAVA\_TOOL\_OPTIONS很可能是你唯一的可选项。有关此环境变量的官方文档在此(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fdocs.oracle.com%2Fjava
Stella981 Stella981
1年前
Scala之eq,equals,==的区别
一.简介  根据官方API(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Flink.jianshu.com%3Ft%3Dhttp%3A%2F%2Fwww.scalalang.org%2Fapi%2Fcurrent%2F%23scala.AnyRef)的定义:f
Stella981 Stella981
1年前
Kafka的简单介绍_基础知识和应用场景介绍一下,一篇入门的文章
1.kafka介绍关于kafka入门的文章最好的就莫过于kafka的官方文档(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fkafka.apache.org%2Fdocumentation.html)了,这上面对kafka的定义是:Kafkaisad
Wesley13 Wesley13
1年前
java8新特性整理
java9快来了,必须得梳理一下java8了。官方文档:http://docs.oracle.com/javase/specs/jls/se8/html/index.html(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fdocs.oracle.com%2Fjavase%2Fspec
Stella981 Stella981
1年前
JVM 常用命令行参数
JVM的命令行参数参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fdocs.oracle.com%2Fjavase%2F8%2Fdocs
helloworld_28799839 helloworld_28799839
4个月前
常用知识整理
Javascript判断对象是否为空jsObject.keys(myObject).length0经常使用的三元运算我们经常遇到处理表格列状态字段如status的时候可以用到vue