【Java】理解ClassNotFoundException与NoClassDefFoundError的区别
一、概念上的认识
1)Exception与Error的区别
1.Exception的出现不会导致程序结束,用户程序可以捕获该异常
2.Error的出现会导致程序结束,用户程序无法捕获Error错误
2)ClassNotFoundException和NoClassDefFoundError相同点和不同点
相同点:
都是由于在运行时,程序无法加载指定的类,也就是在通过类的全限定名称无法找到匹配的class文件
不同点:
ClassNotFoundException一般是通过反射获取某个类时会出现,比如Class.forName("类的全限定名称")
NoClassDefFoundError一般是通过new的方式创建某个类的时候,并且在编译期class类存在,但是运行期等到加载类的时候class不存在(比如丢了或者手动删除了)
3)都是由于类不存在导致的,为啥又要区分呢
我觉得,是因为出现的场景不一样,ClassNotFoundException出现的场景比如反射获取某个类的时候,类不存在可能是正常的,是用户所预期的。但是NoClassDefFoundError出现的场景是new,那么类不存在肯定不是用户所预期的,是不正常的,所以用error来终止程序的运行。
二、模拟这两种异常的出现
注意下面所创建的类都没有指定package包名,目的方便在当前目录,使用java命令直接可以执行
1)ClassNotFoundException
1.创建ClassNotFoundExceptionTest.java测试类
/**
* @author zhangboqing
* @date 2019/11/27
*/
public class ClassNotFoundExceptionTest {
public static void main(String[] args) throws ClassNotFoundException {
Class.forName("HaHa");
}
}
2.javac编译ClassNotFoundExceptionTest.java会生成ClassNotFoundExceptionTest.class类
javac ClassNotFoundExceptionTest.java
3.java执行ClassNotFoundExceptionTest中的main方法,就会出现ClassNotFoundException
➜ Downloads java ClassNotFoundExceptionTest
Exception in thread "main" java.lang.ClassNotFoundException: HaHa
at java.net.URLClassLoader.findClass(URLClassLoader.java:)
at java.lang.ClassLoader.loadClass(ClassLoader.java:)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:)
at java.lang.ClassLoader.loadClass(ClassLoader.java:)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:)
at ClassNotFoundExceptionTest.main(ClassNotFoundExceptionTest.java:)
2)NoClassDefFoundError
1.创建NoClassDefFoundErrorTest的测试类和TestNoClassDefFoundErrorBean的不同类
/**
* @author zhangboqing
* @date 2019/11/27
*/
public class NoClassDefFoundErrorTest {
public static void main(String[] args) throws ClassNotFoundException {
TestNoClassDefFoundErrorBean bean = new TestNoClassDefFoundErrorBean();
System.out.println(bean.name);
}
}
/**
* @author zhangboqing
* @date 2019/11/27
*/
public class TestNoClassDefFoundErrorBean {
public String name = "";
}
2.javac编译上面两个类
javac NoClassDefFoundErrorTest.java TestNoClassDefFoundErrorBean.java
3.将生成的TestNoClassDefFoundErrorBean.class删除掉
4.java执行NoClassDefFoundErrorTest中main方法,就会出现NoClassDefFoundError
➜ Downloads java NoClassDefFoundErrorTest
Exception in thread "main" java.lang.NoClassDefFoundError: TestNoClassDefFoundErrorBean
at NoClassDefFoundErrorTest.main(NoClassDefFoundErrorTest.java:)
Caused by: java.lang.ClassNotFoundException: TestNoClassDefFoundErrorBean
at java.net.URLClassLoader.findClass(URLClassLoader.java:)
at java.lang.ClassLoader.loadClass(ClassLoader.java:)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:)
at java.lang.ClassLoader.loadClass(ClassLoader.java:)
... more
【Java】理解ClassNotFoundException与NoClassDefFoundError的区别的更多相关文章
- ClassNotFoundException和 NoClassDefFoundError的区别
##### 1. 类型 ClassNotFoundException继承自Exception,属于java异常类.NoClassDefFoundError继承自Error,在java中Error一般属 ...
- ClassNotFoundException和NoClassDefFoundError的区别
ClassNotFoundException ClassNotFoundException的产生原因:就是找不到指定的class. ClassNotFoundException发生在加载阶段. 常见的 ...
- 【java虚拟机系列】JVM类加载器与ClassNotFoundException和NoClassDefFoundError
在我们日常的项目开发中,会经常碰到ClassNotFoundException和NoClassDefFoundError这两种异常,对于经验足够的工程师而言,可能很轻松的就可以解决,但是却不一定明白为 ...
- java.lang.ClassNotFoundException与java.lang.NoClassDefFoundError的区别
java.lang.ClassNotFoundException与java.lang.NoClassDefFoundError的区别 以前一直没有注意过这个问题,前两天机缘巧合上网查了一下,然后自 ...
- java.lang.ClassNotFoundException和java.lang.NoClassDefFoundError的区别
java里生成对象有如下两种方式: 1: Object obj = new ClassName(); 直接new一个对象 2: Class clazz = Class.forName(ClassNam ...
- java.lang.ClassNotFoundException: net.sf.json.JSONArray,java.lang.NoClassDefFoundError: net/sf/json/JSONArray jetty跑项目遇到的问题
2016-05-18 15:44:25 ERROR Dispatcher.error[user:|url:]:L38 - Dispatcher initialization failed Unable ...
- java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter /struts2.1.3以前版本和之后版本区别/新版Eclipse找不到Java EE Module Dependencies选项
严重: Exception starting filter struts2java.lang.ClassNotFoundException: org.apache.struts2.dispatcher ...
- 转:Java中abstract和interface的区别
转自:Java中abstract和interface的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java ...
- Java中this与super的区别【6】
若有不正之处,请多多谅解并欢迎批评指正,不甚感激.请尊重作者劳动成果: 本文原创作者:pipi-changing本文原创出处:http://www.cnblogs.com/pipi-changing/ ...
随机推荐
- 2016年蓝桥杯B组C/C++决赛题目
2016年第七届蓝桥杯B组C/C++决赛题目 点击查看2016年第七届蓝桥杯B组C/C++决赛题解 1.一步之遥 从昏迷中醒来,小明发现自己被关在X星球的废矿车里. 矿车停在平直的废弃的轨道上. 他的 ...
- luoguP5094 [USACO04OPEN]MooFest 狂欢节
get 到的 这种需要求 含 max 的式子,枚举最大值的方法非常普遍. 类似的,还有含 min , gcd 的式子,枚举他们也很普遍 主要难点 我们首先想到,先按 v 从小到大排序,因为这样既可以简 ...
- 扎西平措 201571030332《面向对象程序设计 Java 》第一周学习总结
<面向对象程序设计(java)>第一周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 ...
- 关于destoon6.0下的ngnix伪静态
关于destoon6.0下的ngnix伪静态配置 ##rewrite nginx rewrite '(.*)\.(asp|aspx|asa|asax|dll|jsp|cgi|fcgi|pl)(.*)' ...
- day2_窗口句柄切换
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/7/16 14:21 # @Author : 大坏男孩 # @File : d ...
- CF1225C p-binary
CF1225C p-binary 洛谷评测传送门 题目描述 Vasya will fancy any number as long as it is an integer power of two. ...
- 为什么MySQL数据库要用B+树存储索引?
问题:MySQL中存储索引用到的数据结构是B+树,B+树的查询时间跟树的高度有关,是log(n),如果用hash存储,那么查询时间是O(1).既然hash比B+树更快,为什么mysql用B+树来存储索 ...
- LeetCode 225:用队列实现栈 Implement Stack using Queues
题目: 使用队列实现栈的下列操作: push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素 empty() -- 返回栈是否为空 Implement th ...
- TestNg之XMl形式实现多线程测试
为什么要使用多线程测试? 在实际测试中,为了节省测试时间,提高测试效率,在实际测试场景中经常会采用多线程的方式去执行,比如爬虫爬数据,多浏览器并行测试. 关于多线程并行测试 TestNG中实现多线程并 ...
- ICT638 Mobile and App Development
Assessment Cover SheetStudent ID CohortStudent NameProgrammeEnrolledDiploma in Information Technolog ...