Java中NoClassDefFoundError 和 ClassNotFoundException的区别

 更新时间:2022年06月14日 09:32:06   作者:共饮一杯无  
Java中NoClassDefFoundError和ClassNotFoundException的区别,从类继承层次上来看,ClassNotFoundException是从Exception继承的,所以ClassNotFoundException是一个检查异常。具体详情需要的朋友可以参考下面文章内容

前言:

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

NoClassDefFoundError

当JVM在加载一个类的时候,如果这个类在编译时是可用的,但是在运行时找不到这个类的定义的时候,JVM就会抛出一个NoClassDefFoundError错误。比如当我们在new一个类的实例的时候,如果在运行时类找不到,则会抛出一个NoClassDefFoundError的错误。通常发生在执行动态代码块或者初始化静态字段时报了异常,从而导致类初始化失败而引发NoClassDefFoundError。

案例如下:

public class ClassWithInitErrors {
    static int data = 1 / 0;
}

public class NoClassDefFoundErrorTest {
    public ClassWithInitErrors getClassWithInitErrors() {
        ClassWithInitErrors test = new ClassWithInitErrors();
        return test;
    }

    @Test(expected = NoClassDefFoundError.class)
    public void givenInitErrorInClass_whenloadClass_thenNoClassDefFoundError() {
        NoClassDefFoundErrorTest sample
                = new NoClassDefFoundErrorTest();
        sample.getClassWithInitErrors();
    }
}

执行程序后会出现如下错误:

java.lang.Exception: Unexpected exception, expected<java.lang.NoClassDefFoundError> but was<java.lang.ExceptionInInitializerError>

    at org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:28)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
    ...  more
Caused by: java.lang.ArithmeticException: / by zero
    at com.zjq.dailyrecord.throwable.ClassWithInitErrors.<clinit>(ClassWithInitErrors.java:4)
    ... 25 more

ClassNotFoundException

当应用程序运行的过程中尝试使用类加载器去加载Class文件的时候,如果没有在classpath中查找到指定的类,就会抛出ClassNotFoundException。一般情况下,当我们使用Class.forName()或者ClassLoader.loadClass以及使用ClassLoader.findSystemClass()在运行时加载类的时候,如果类没有被找到,那么就会导致JVM抛出ClassNotFoundException。
最简单的,当我们使用JDBC去连接数据库的时候,我们一般会使用Class.forName()的方式去加载JDBC的驱动,如果我们没有将驱动放到应用的classpath下,那么会导致运行时找不到类,所以运行Class.forName()会抛出ClassNotFoundException。

案例如下:

public class ClassNotFoundExceptionTest {
    public static void main(String[] args) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

执行后输出:

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver     at java.net.URLClassLoader.findClass(URLClassLoader.java:381)     at java.lang.ClassLoader.loadClass(ClassLoader.java:424)     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)     at java.lang.ClassLoader.loadClass(ClassLoader.java:357)     at java.lang.Class.forName0(Native Method)     at java.lang.Class.forName(Class.java:264)     at com.zjq.dailyrecord.throwable.ClassNotFoundExceptionTest.main(ClassNotFoundExceptionTest.java:6)

总结区别:

解决办法

他们的主要原因是运行时类路径中类文件不可用。

下面是几点具体的原因:

  • 排查所需的jar包是否在类路径中,如果没有就添加进去。
  • 如果发现类在classpath里面,很有可能是classpath被重写了,需要再次确定应用准确的classpath
  • 依赖包发生了冲突,比如应该依赖高版本jar包,但又其它包传递依赖了低版本jar包,导致高版本中某些类找不到。
  • 如果应用中用到了多个类加载器,一个类加载器加载的类,无法再其他的类加载器中使用。

到此这篇关于Java中NoClassDefFoundError 和 ClassNotFoundException的区别的文章就介绍到这了,更多相关Java NoClassDefFoundError 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java启动线程的3种方式对比分析

    java启动线程的3种方式对比分析

    这篇文章主要为大家对比分析了java启动线程的3种方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • 配置tjxCold(idea效率插件)的模版教程详解

    配置tjxCold(idea效率插件)的模版教程详解

    这篇文章主要介绍了配置tjxCold(idea效率插件)的模版教程详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 初探Spring Cloud Gateway实战

    初探Spring Cloud Gateway实战

    这篇文章主要介绍了创建网关项目(Spring Cloud Gateway)过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-08-08
  • 关于SpringBoot中Ajax跨域以及Cookie无法获取丢失问题

    关于SpringBoot中Ajax跨域以及Cookie无法获取丢失问题

    这篇文章主要介绍了关于SpringBoot中Ajax跨域以及Cookie无法获取丢失问题,本文具有参考意义,遇到相同或者类似问题的小伙伴希望可以从中找到灵感
    2023-03-03
  • java设计优化之代理模式

    java设计优化之代理模式

    这篇文章主要为大家详细介绍了java设计优化中的代理模式,感兴趣的朋友可以参考一下
    2016-03-03
  • Spring MVC学习教程之视图深入解析

    Spring MVC学习教程之视图深入解析

    这篇文章主要给大家介绍了关于Spring MVC学习教程之视图解析的相关资料,文中通过示例代码介绍的非常详细,对大家学习或使用spring mvc具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2018-11-11
  • Java11新特性之HttpClient小试牛刀

    Java11新特性之HttpClient小试牛刀

    本文主要研究一下Java11的HttpClient的基本使用。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • java笔记学习之操作符

    java笔记学习之操作符

    本篇文章给大家分享了关于Java中操作符的相关知识点以及难点总结,有需要的朋友参考学习下吧。
    2018-04-04
  • 详解Kotlin的空指针处理

    详解Kotlin的空指针处理

    这篇文章主要介绍了详解Kotlin的空指针处理的相关资料,需要的朋友可以参考下
    2017-06-06
  • Java 8新时间日期库java.time的使用示例

    Java 8新时间日期库java.time的使用示例

    这篇文章主要给你大家介绍了关于Java 8新时间日期库java.time的使用示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-07-07

最新评论