【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/ ...
随机推荐
- Git入门基础教程和SourceTree应用
目录 一.Git的安装 1.1 图形化界面 1.2 命令行界面 二.本地仓库的创建与提交 2.1 图形化界面 2.1.1 首先在电脑上有一个空白目录 2.1.2 打开SourceTree 2.1.3 ...
- Vue之methods watch和compute的区别和联系
computed是用来把多个基础的数据组合成一个复杂的数据:同时获得了vue提供的自动变更通知机制. 即将基础数据变为复杂数据,同时获得自动变更通知机制 watch是利用了vue的自动变更通知机制,用 ...
- springboot项目jar包运行
springboot项目jar包运行 参考 Linux后台运行java的jar包 步骤 进入maven项目中,打包项目. mvn package -Dmaven.test.skip=true 运行ja ...
- 动态设置html的font-size值
PC端 (function () { function setRootFontSize() { let rem, rootWidth; let rootHtml = document.document ...
- Unity 插件宝典 (张忠喜 廖一庭 著)
第1章 模型类插件 第2章 特效类插件 第3章 动画插件 第4章 编辑器插件 第5章 脚本类插件 第6章 GUI插件 第7章 Shaders插件 第8章 优化类插件 第9章 综合应用----卡通版赛车 ...
- 数据仓库001 - 复习Linux shell命令 - pwd mkdir mv tail -f xxx.log 和 ail -F xxx.log
1. [root@localhost ~]# 的含义 ? [登录的用户 机器的名称 家目录] 2. 查看当前光标所在的目录 pwd [root@localhost ~]# pwd /roo ...
- Spring Cloud和Spring Boot的版本问题
很多人在使用springboot和springcloud,但是对于这两者之间的版本关系不是很清楚,特别是在面临升级的时候不知道该如何操作.本文简要摘录的官方文档的部分内容作为依据,供广大同行参考. 问 ...
- 安装更新时出现一些问题,但我们稍后会重试。如果你继续看到此错误,并且想要搜索 Web 或联系支持人员以获取相关信息,以下信息可能会对你有帮助: (0x80070426)
安装更新时出现一些问题,但我们稍后会重试.如果你继续看到此错误,并且想要搜索 Web 或联系支持人员以获取相关信息,以下信息可能会对你有帮助: (0x80070426) https://answers ...
- golang实战--客户信息管理系统
总计架构图: model/customer.go package model import ( "fmt" ) type Customer struct { Id int Name ...
- php imagemagick 翻译目录
图像处理(ImageMagick) 介绍 安装/配置 要求 安装 运行时配置 资源类型 预定义常数 例子 基本用法 Imagick - Imagick课 Imagick :: adaptiveBlur ...