>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 20660 个阅读者 刷新本主题
 * 贴子主题:  NoClassDefFoundError和ClassNotFoundException的区别 回复文章 点赞(0)  收藏  
作者:Jacky    发表时间:2020-03-08 21:48:01     消息  查看  搜索  好友  邮件  复制  引用

   在写Java程序的时候,当一个类找不到的时候,JVM有时候会抛出ClassNotFoundException异常,而有时候又会抛出NoClassDefFoundError。看两个异常的字面意思,好像都是类找不到,但是JVM为什么要用两个异常去区分类找不到的情况呢?这个两个异常有什么不同的地方呢?

ClassNotFoundException

  ClassNotFoundException是一个运行时异常。从类继承层次上来看,ClassNotFoundException是从Exception继承的,所以ClassNotFoundException是一个检查异常。

      当应用程序运行的过程中尝试使用类加载器去加载Class文件的时候,如果没有在classpath中查找到指定的类,就会抛出ClassNotFoundException。一般情况下,当我们使用Class.forName()或者ClassLoader.loadClass以及使用ClassLoader.findSystemClass()在运行时加载类的时候,如果类没有被找到,那么就会导致JVM抛出ClassNotFoundException。

       最简单的,当我们使用JDBC去连接数据库的时候,我们一般会使用Class.forName()的方式去加载JDBC的驱动,如果我们没有将驱动放到应用的classpath下,那么会导致运行时找不到类,所以运行Class.forName()会抛出ClassNotFoundException。

public  class  MainClass {
     public  static  void  main(String[] args) {
         try  {
            Class.forName("oracle.jdbc.driver.OracleDriver" );
        }  catch  (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

     输出:

    java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
    at java.net.URLClassLoader.findClass(URLClassLoader.java: 381 )
    at java.lang.ClassLoader.loadClass(ClassLoader.java: 424 )
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java: 331 )
    at java.lang.ClassLoader.loadClass(ClassLoader.java: 357 )
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java: 264 )
    at MainClass.main(MainClass.java: 7)

NoClassDefFoundError

  NoClassDefFoundError异常,看命名后缀是一个Error。从类继承层次上看,NoClassDefFoundError是从Error继承的。和ClassNotFoundException相比,明显的一个区别是,NoClassDefFoundError并不需要应用程序去关心catch的问题。

       当JVM在加载一个类的时候,如果这个类在编译时是可用的,但是在运行时找不到这个类的定义的时候,JVM就会抛出一个NoClassDefFoundError错误。比如当我们在new一个类的实例的时候,如果在运行是类找不到,则会抛出一个NoClassDefFoundError的错误。

public  class  TempClass {
}

public  class  MainClass {
     public  static  void  main(String[] args) {
        TempClass t =  new  TempClass();
    }
}

     首先这里我们先创建一个TempClass,然后编译以后,将TempClass生产的TempClass.class文件删除,然后执行程序,输出:

     Exception  in thread  " main "  java.lang.NoClassDefFoundError: TempClass
    at MainClass.main(MainClass.java: 6 )
Caused by: java.lang.ClassNotFoundException: TempClass
    at java.net.URLClassLoader.findClass(URLClassLoader.java: 381 )
    at java.lang.ClassLoader.loadClass(ClassLoader.java: 424 )
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java: 331 )
    at java.lang.ClassLoader.loadClass(ClassLoader.java: 357 )
    ...  1  more

总结一下区别

ClassNotFoundException NoClassDefFoundError
从java.lang.Exception继承,是一个Exception类型 从java.lang.Error继承,是一个Error类型
当动态加载Class的时候找不到类会抛出该异常 当编译成功以后执行过程中Class找不到导致抛出该错误
一般在执行Class.forName()、ClassLoader.loadClass()或ClassLoader.findSystemClass()的时候抛出 由JVM的运行时系统抛出



----------------------------
原文链接:https://www.cnblogs.com/duke2016/p/9153241.html

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-03-09 12:26:36 重新编辑]
网站系统异常


系统异常信息
Request URL: http://www.javathinker.net/WEB-INF/lybbs/jsp/topic.jsp?postID=2682

java.lang.NullPointerException

如果你不知道错误发生的原因,请把上面完整的信息提交给本站管理人员