广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java中NoClassDefFoundError 和 ClassNotFoundException的区别
  • 355
分享到

Java中NoClassDefFoundError 和 ClassNotFoundException的区别

2024-04-02 19:04:59 355人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录NoClassDefFoundErrorClassNotFoundException解决办法前言: 从类继承层次上来看,ClassNotFoundException是从Exce

前言:

从类继承层次上来看,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 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java中NoClassDefFoundError 和 ClassNotFoundException的区别

本文链接: https://www.lsjlt.com/news/151358.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中NoClassDefFoundError 和 ClassNotFoundException的区别
    目录NoClassDefFoundErrorClassNotFoundException解决办法前言: 从类继承层次上来看,ClassNotFoundException是从Exce...
    99+
    2022-11-13
  • java中HashMap和LinkedHashMap的区别
    HashMaphashMap是最常用的Map,根据键的HashCode值存储数据,可以根据键直接获取它的值,具有很快的访问速度,遍历时候的顺序是完全随机的。HashMap只允许一个键为Null,允许多个值为Null。特性: 完全随机优点: ...
    99+
    2019-03-31
    java HashMap LinkedHashMap 区别
  • java中comparable和comparator的区别
    确定两个对象之间的大小关系及排列顺序称为比较,能实现这个比较功能的类或方法称之为比较器,在java中有两种比较器。内部比较器(Comparable接口)和外部比较器(Comparator接口)一、比较器排序Comparator的使用——可以...
    99+
    2015-02-01
    java comparable comparator 区别
  • java中栈和堆的区别
    在说堆和栈之前,我们先说一下JVM(虚拟机)内存的划分: (推荐学习:java课程)Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空间的。JVM运行时在内存中开辟一片内存区...
    99+
    2021-03-03
    java入门 java
  • java中print和println的区别
    printprintln的区别 (推荐学习:java课程)print将它的参数显示在命令窗口,并将输出光标定位在所显示的最后一个字符之后。println 将它的参数显示在命令窗口,并在结尾加上换行符,将输出光标定位在下一行的...
    99+
    2017-03-18
    java入门 java
  • java中int和Integer的区别
    java中int和Integer的区别:类型不同,int是数据类型,而integer是引用类型。int存储的是数值,integer存储的是引用对象的地址。integer对象会占用更多的内存,而int占用的空间少。Integer变量与int变...
    99+
    2022-10-20
  • Java中stream.map和stream.forEach的区别
    目录什么是 stream 流stream.map 和 stream.forEach 的区别网上很多关于讲解这俩个区别的文章,但大多数要么不明不白,要么太复杂难理解。所以自己通俗的讲一...
    99+
    2022-11-13
    Java stream.map Java stream.forEach Java stream.map和stream.forEach
  • Java 中的 this 和 super 区别
    目录1、简介2、引子2.1 父类中声明无参构造函数2.2 子类显示的通过super调用父类的有参构造函数3、this4、super 5、总结5.1 对比差异 5.2 相同点 5.3 ...
    99+
    2022-11-12
  • java 中 System.out.println()和System.out.write()的区别
     java 中 System.out.println()和System.out.write()的区别.这两个函数一个是System.out.write()输出字符流,System.out.println()是输出字节流,很简单。看...
    99+
    2023-05-31
    java println() write()
  • java equals和==的区别
    java9举例代码: (推荐学习:java课程)String str1 = "abc"; String str2 = "abc"; String str3 = new String("abc"); String s...
    99+
    2015-02-02
    java入门 java
  • Java中ArrayList和LinkedList区别
    目录1 前言2 数据结构的区别2.1 ArrayList2.2 LinkedList2.3 使用场景3 源码分析3.1 ArrayList核心源码3.2 LinkedList核心源码...
    99+
    2022-11-12
  • java中string和char区别
    1、类型不同char是字符类型, String是字符串类型。 (推荐学习:java课程)2、包含String字符串是用来包含字符串的, char是用来包含单字符的。例如:char a...
    99+
    2018-11-26
    java教程 java
  • Java中equals和==的区别详解
    目录1.java中的数据类型,可分为两类: 2.再稍微改动一下程序,会有更奇怪的发现: 3. 字符串缓冲池 4.再次更改程序: 总结1.java中的数据类型,可分为两类: 1.基本...
    99+
    2022-11-12
  • Java中List.forEach()和List.stream().forEach()的区别
    少罗嗦,直接干! 在Java中,List是一种常用的集合类,用于存储一组元素。List提供了多种遍历元素的方式,包括使用forEach()方法和使用Stream流的forEach()方法。 List....
    99+
    2023-10-26
    java list windows
  • java中栈和队列的区别
    栈:栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。 (推荐学习:java课程)栈(Stack)是操作系统在建立某个进程时或者线程(在...
    99+
    2020-09-10
    java入门 java
  • java泛型中T和?的区别
    T 代表一种类型。加在类上:class SuperClass{}加在方法上:public void fromArrayToCollection(T[] a, Collection c){}(免费学习视频教程分享:java视频教程)方法上的代...
    99+
    2014-10-15
    java入门 java 泛型 T ? 区别
  • 详解Java中==和equals()的区别
    目录1. ==1.1 基本数据类型1.2 引用数据类型1.3 小结2. equals3. 总结1. == == 是运算符,用来判断两个值是否相等,==可以使用在基本数据类型变量和引用...
    99+
    2022-11-12
  • Java中for(;;)和while(true)的区别
    目录1、问题来源2、比较2.1 测试代码for2.2 测试代码while3、结论 1、问题来源 在阅读Java的JDK源码时,发现大部分写源码的大佬多采用for(;;)的方式来死循环...
    99+
    2022-11-12
  • java和java web区别
    java和java web区别人们平常说的Java一般指JavaSE,也就是Java Standard Edition,Java的标准版,一般用来开发桌面应用程序,但是在开发桌面应用程序上相对VB,Delphi,VC++并没有什么优势。而J...
    99+
    2022-01-04
    java
  • java中 ${} 和 #{} 有什么区别
    目录前言1.功能不同1.1 ${} 的问题2.使用场景不同3.安全性不同3.1 使用 ${} 实现用户登录3.2 使用 #{} 实现用户登录总结前言 ${} 和 #{} 都...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作