最近出去面试的时候被问到这二者的区别, 当时就懵逼了,修习还不够,回巢慢慢进修吧。 面试
直奔正文吧. 数据库
首先 最最基本的区别在于,NoClassFoundException是一个 非受检异常,它是一个 RuntimeException. NoClassDefFoundError是一个错误。 编程
其次 所形成的缘由也不一样:
框架
形成 NoClassFoundException主要是在程序运行过程当中,动态去加载类的时候,在ClassPath中找不到该类,因而就抛出NoClassFoundException,最多见的例子好比说,在使用JDBC编程的过程当中使用Class.forName("Driver Name Here")的时候,若是并无在classpath中添加相应的数据库驱动包,则会抛出NoClassFoundException异常,除此以外还有ClassLoader.loadClass和ClassLOader.findSystemClass在加载类时也可能抛出NoClassFoundException的异常。须要注意的是,还有一种会致使NoClassFoundException的缘由是当一个类已经某个类加载器加载到内存中了,此时另外一个类加载器又尝试着动态地从同一个包中加载这个类。在不少搭建框架的时候,出现包冲突的时候就会有此类问题,ClassPath里面会有同名的类。
maven
NoClassFoundException 在编译过程当中, 编译器是不会发现此类错误的,每每是在程序运行时,加载器抛出的异常。 spa
形成NoClassDefFoundError的缘由也比较晦涩, 当JVM或者类加载器 在加载类的时候找不到类定义。字面意思看上去有点难以理解, 好比说,当 程序 去 new 一个对象或者要import 类的时候 找不到该类,看似好像和NoClassFoundException差很少嘛,其实此类错误主要是,程序在编译过程当中是经过编译,而且是有这个类的,到了运行环境的时候又没有这个类了,多是把jar包删除了. 常常是在 maven 作构建的时候容易形成这种错误哦。
对象