【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/ ...
随机推荐
- [日常] 前端资源测试机上忽略版本号的的nginx配置
利用nginx的rewrite的指令,可以实现url的重新跳转,rewrtie有四种不同的flag,分别是redirect(临时重定向).permanent(永久重定向).break和last.其中前 ...
- [PHP] vscode配置SFTP扩展同步文件
在我们的项目开发过程中,经常有一种模式,有一台linux的开发机作为我们的测试机器,上面安装了ftp服务.我们在windows系统的本地机器使用IDE编写代码,自动或者保存时同步上传到测试机下,这样就 ...
- Docker Harbor
简介: Harbor是一个用于存储Docker镜像的企业级Registry服务:本章将介绍如何搭建Harbor Registry! Github官方安装文档: https://github.com/g ...
- PHP转Go系列:数组与切片
数组的定义 用过PHP的同学应该很清楚,无论多么复杂的数据格式都可以用数组来表达,什么类型的数据都可以往里塞,它是工作必备的一部分,使用很简单,易用程度简直变态. $array = [1, 'name ...
- CodeForces - 1251E2 (思维+贪心)
题意 https://vjudge.net/problem/CodeForces-1251E2 一共有 n 个选民,你可以付出 pi 的代价让第 i 个选民为你投票,或者,在为你投票的人数达到 mi ...
- golang数据结构和算法之StackArray数组堆栈
用数组实现的堆栈, 另一种,是用链表实现的堆栈, 在各种不同的编程语言上, 实现都是类似的. StackArray.go package StackArray //基于数组实现的堆栈 const ar ...
- ACM-求质因数
求输入数字的所有质因数,并将所有质因数进行排序,并以质因数+空格的形式输出 #include <iostream> #include <string> #include < ...
- 全网最新方法:Win10下如何安装和搭建appium自动化测试环境
为了方便大家,下面是本人安装和搭建appium所需要的软件,自取. 链接:https://pan.baidu.com/s/1wl5Xnos4BmnSZsBRd6B5YA#list/path=%2F ...
- angular6.x 引入echarts
因为angular2+ 使用 ==typescript==开发,所以想要使用echarts,必须安装echarts针对angular的插件ngx-echarts.本文案列实际效果如上图. 安装ngx- ...
- 性能对比:aelf智能合约运行环境性能是evm的1000倍
测试用例及代码库 机器配置 测试结果 3.1 EVM 3.2 AElf 3.2.1 LoopDivAdd10M 3.2.2 LoopExpNop1M 测试结论 近期对标以太坊做了一系列针对测试,在此次 ...