一、概念上的认识

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测试类

  1. /**
  2. * @author zhangboqing
  3. * @date 2019/11/27
  4. */
  5. public class ClassNotFoundExceptionTest {
  6. public static void main(String[] args) throws ClassNotFoundException {
  7. Class.forName("HaHa");
  8. }
  9. }

2.javac编译ClassNotFoundExceptionTest.java会生成ClassNotFoundExceptionTest.class类

  1. javac ClassNotFoundExceptionTest.java

3.java执行ClassNotFoundExceptionTest中的main方法,就会出现ClassNotFoundException

  1. Downloads java ClassNotFoundExceptionTest
  2. Exception in thread "main" java.lang.ClassNotFoundException: HaHa
  3. at java.net.URLClassLoader.findClass(URLClassLoader.java:)
  4. at java.lang.ClassLoader.loadClass(ClassLoader.java:)
  5. at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:)
  6. at java.lang.ClassLoader.loadClass(ClassLoader.java:)
  7. at java.lang.Class.forName0(Native Method)
  8. at java.lang.Class.forName(Class.java:)
  9. at ClassNotFoundExceptionTest.main(ClassNotFoundExceptionTest.java:)

2)NoClassDefFoundError

1.创建NoClassDefFoundErrorTest的测试类和TestNoClassDefFoundErrorBean的不同类

  1. /**
  2. * @author zhangboqing
  3. * @date 2019/11/27
  4. */
  5. public class NoClassDefFoundErrorTest {
  6. public static void main(String[] args) throws ClassNotFoundException {
  7. TestNoClassDefFoundErrorBean bean = new TestNoClassDefFoundErrorBean();
  8. System.out.println(bean.name);
  9. }
  10. }
  1. /**
  2. * @author zhangboqing
  3. * @date 2019/11/27
  4. */
  5. public class TestNoClassDefFoundErrorBean {
  6. public String name = "";
  7. }

2.javac编译上面两个类

  1. javac NoClassDefFoundErrorTest.java TestNoClassDefFoundErrorBean.java

3.将生成的TestNoClassDefFoundErrorBean.class删除掉

4.java执行NoClassDefFoundErrorTest中main方法,就会出现NoClassDefFoundError

  1. Downloads java NoClassDefFoundErrorTest
  2. Exception in thread "main" java.lang.NoClassDefFoundError: TestNoClassDefFoundErrorBean
  3. at NoClassDefFoundErrorTest.main(NoClassDefFoundErrorTest.java:)
  4. Caused by: java.lang.ClassNotFoundException: TestNoClassDefFoundErrorBean
  5. at java.net.URLClassLoader.findClass(URLClassLoader.java:)
  6. at java.lang.ClassLoader.loadClass(ClassLoader.java:)
  7. at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:)
  8. at java.lang.ClassLoader.loadClass(ClassLoader.java:)
  9. ... more

【Java】理解ClassNotFoundException与NoClassDefFoundError的区别的更多相关文章

  1. ClassNotFoundException和 NoClassDefFoundError的区别

    ##### 1. 类型 ClassNotFoundException继承自Exception,属于java异常类.NoClassDefFoundError继承自Error,在java中Error一般属 ...

  2. ClassNotFoundException和NoClassDefFoundError的区别

    ClassNotFoundException ClassNotFoundException的产生原因:就是找不到指定的class. ClassNotFoundException发生在加载阶段. 常见的 ...

  3. 【java虚拟机系列】JVM类加载器与ClassNotFoundException和NoClassDefFoundError

    在我们日常的项目开发中,会经常碰到ClassNotFoundException和NoClassDefFoundError这两种异常,对于经验足够的工程师而言,可能很轻松的就可以解决,但是却不一定明白为 ...

  4. java.lang.ClassNotFoundException与java.lang.NoClassDefFoundError的区别

    java.lang.ClassNotFoundException与java.lang.NoClassDefFoundError的区别   以前一直没有注意过这个问题,前两天机缘巧合上网查了一下,然后自 ...

  5. java.lang.ClassNotFoundException和java.lang.NoClassDefFoundError的区别

    java里生成对象有如下两种方式: 1: Object obj = new ClassName(); 直接new一个对象 2: Class clazz = Class.forName(ClassNam ...

  6. 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 ...

  7. 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 ...

  8. 转:Java中abstract和interface的区别

    转自:Java中abstract和interface的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java ...

  9. Java中this与super的区别【6】

    若有不正之处,请多多谅解并欢迎批评指正,不甚感激.请尊重作者劳动成果: 本文原创作者:pipi-changing本文原创出处:http://www.cnblogs.com/pipi-changing/ ...

随机推荐

  1. 『009』Python

    『004』索引-Language Python 准备更新中

  2. linux so库方式

    gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so

  3. lua 9 parttern 字符极其简要的介绍

    摘自:https://www.lua.org/pil/20.2.html 所有的字符和含义包括: . all characters %a letters %c control characters % ...

  4. 微信小程序之结构目录、视图层、双线程模型、生命周期、事件传递冒泡、组件、request、登录授权及支付

    结构目录与配置介绍 视图层与基础语法 双线程模型 生命周期 事件.传递和冒泡 组件.自定义组件.组件事件传递页面 Request.路由跳转.本地存储 登录(后端实现) | 授权(后端实现) 支付(后端 ...

  5. 剑指Offer-26.二叉搜索树与双向链表(C++/Java)

    题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 分析: 创建两个指针,分别指向要处理的当前元素和当前元素的前一个元素.利用中 ...

  6. Django Form 内置字段

    常用字段: Field required=True, 是否允许为空 widget=None, HTML插件 label=None, 用于生成Label标签或显示内容 initial=None, 初始值 ...

  7. http与Rpc

    RPC即远程服务调用 出现原因:随着项目越来越大,访问量越来越大,为了突破性能瓶颈,需要将项目拆分成多个部分,这样比起传统的项目都是本地内存调用,分布式的项目之间需要在网络间进行通信 服务之间的远程调 ...

  8. array 数组

  9. Nginx 安装与部署配置

    下载 官方网站:https://nginx.org/en/download.html Windows下安装 安装 下载后解压(切记不能含有中文路径!!),文件结构如图(我解压的路径就有中文,记得拷贝放 ...

  10. Windows安装RabbitMQ并设置数据存储目录

    一.安装Elang 下载otp_win64_xx.x.exe,当前使用otp_win64_21.3.exe版本,按步骤完成安装. 下载地址:http://www.erlang.org/download ...