zoukankan      html  css  js  c++  java
  • ClassNotFoundException 和 NoClassDefFoundError 区别

    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();
            }
        }
    }
    View Code
    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)
    View Code

    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();
        }
    }
    View Code

    首先这里我们先创建一个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
    View Code

    总结一下区别

    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

  • 相关阅读:
    Java 8 锁机制
    Elasticsearch学习资料
    数据库相关
    Linux常用Shell命令
    如何高效编写可维护代码?
    分布式开放消息系统(RocketMQ)的原理与实践(转载)
    学习Linux第六天(学习文件权限和特殊权限)
    各大网络厂商列表
    Linux服务器系统信息查询
    关于情感
  • 原文地址:https://www.cnblogs.com/ylz8401/p/13609392.html
Copyright © 2011-2022 走看看