【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/ ...
随机推荐
- 第十二章 WEB渗透
Web技术发展 • 静态WEB• 动态WEB • 应用程序 • 数据库 • 每个人看到的内容不同 • 根据用户输入返回不同结果 WEB攻击面• Network• OS• WEB Server• App ...
- itest(爱测试) 4.1.1 发布,开源BUG 跟踪管理 & 敏捷测试管理软件
v4.1.1下载地址 :itest下载 itest 简介:查看简介 itest 开源敏捷测试管理,testOps 践行者.可按测试包分配测试用例执行,也可建测试迭代(含任务,测试包,BUG)来组织测试 ...
- 创建Djongo需要改url的地方:
from django.conf.urls import urlfrom django.contrib import adminfrom app01 import viewsurlpatterns = ...
- 【声明式事务】Spring事务介绍(一)
事务管理对于企业应用来说是至关重要的,当出现异常情况时,它也可以保证数据的一致性. Spring事务有两种管理方式:编程式事务和声明式事务 编程式事务使用TransactionTemplate或者直接 ...
- 详解C++ STL multiset 容器
详解C++ STL multiset 容器 本篇随笔简单介绍一下\(C++STL\)中\(multiset\)容器的使用方法及常见使用技巧. multiset容器的概念和性质 \(set\)在英文中的 ...
- html头部标签汇总
<!DOCTYPE html> <!-- 使用 HTML5 doctype,不区分大小写 --> <html lang="zh-cmn-Hans"&g ...
- 安卓和IOS、微信 公用一个二维码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 中秋快乐,分享福利脑图:入门spring cloud
- python3爬虫筛选所需要数据
第一次使用博客园,也是第一篇文章,让我们一起开启学习之旅吧!! 昨天在为某授权系统做安全性测试的时候,可以未授权访问系统的用户登陆统计记录.由此想整理出部分用户名,作为暴力破解的用户名,检查是否存在用 ...
- cap理论与分布式事务的解决方案
现在很火的微服务架构所设计的系统是分布式系统.分布式系统有一个著名的CAP理论,即一个分布式系统要同时满足一致性(Consistency).可用性(Availablility)和分区容错(Partit ...