java.lang.NoClassDefFoundError类似这种错误catch expection是捕获不到的异常-程序员宅基地

技术标签: java  

 

https://blog.csdn.net/weixin_40648117/article/details/80819972

 

一 概念

众所周知java提供了丰富的异常类,这些异常类之间有严格的集成关系,分类为

父类Throwable

Throwable的两个子类Error和Exception

Exception的两个子类CheckedException和RuntimeException

二 发现问题

通常捕获异常catch的时候最大catch到Exception这个类就为止了,当然这能够处理大部分的异常情况。

但是值得注意的是,Exception不能捕捉到所有的异常。比如InvocationTargetException。

像这类 java.lang.NoClassDefFoundError: org/apache/commons/collections4/IterableUtils,由于NoClassDefFoundError是Throwable的Error子类,所以Exception是捕捉不到的

三 解决办法

catch(Throwable t)
{ }
--------------------- 

 

 

这里引出一个概念:java.lang.ClassNotFoundException与java.lang.NoClassDefFoundError的区别

http://www.cnblogs.com/xing901022/p/4185514.html

NoClassDefFoundError

  这个就比较奇葩了,查找其他的资料是说,通过了编译,但是使用的时候,比如new的时候会出错。

  通过查找资料,搜集到如下的场景:

  1 类依赖的class或者jar不存在

  2 类文件存在,但是存在不同的域中

  3 大小写问题,javac编译的时候是无视大小的,很有可能你编译出来的class文件就与想要的不一样!这个没有做验证。

 

本例中,

 

 

 

        try{
            Thread.sleep(10000);

            int count = 0;
            while (true) {
                System.out.println("start");
                String dir = "file:/Users/sunyuming/Downloads/kettle_java_proxy.jar";
                URL url = new URL(dir);
                URL[] urls2 = {url};
                MyUrlClassLoader myUrlClassLoader = new MyUrlClassLoader(urls2);
                Class<?> CA = myUrlClassLoader.loadClass("saturn.Common");
                Object o = CA.newInstance();
                Method method = CA.getMethod("run");
                method.invoke(o);
                System.out.println("done");
                Thread.sleep(5000);
                myUrlClassLoader = null;
                System.out.println("release");
                System.gc();

                ++ count;
                if(count > 5)
                    break;
            }

            System.out.println("alldone");
        } catch (Exception e) {
            System.out.println("found exception");
            e.printStackTrace();
        } catch (Throwable throwable) {
            System.out.println("found throwable");
            throwable.printStackTrace();
        }

 

 

 印证了上述第一种情况:

1 类依赖的class或者jar不存在

有两种会导致,

1)本例子中,以static引用的类不存在于本加载器或父加载器

2)https://www.cnblogs.com/silyvin/articles/10274914.html中的情形,A继承自某个类,而这个类不存在或在不可见的类加载器(非父加载器)中

 

接下去,我们在AppClassloader中加入日志的jar包:

    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
    </dependency>
  </dependencies>

 

形成:

 ok,开始输出了

 

关于这种子加载器中类引用父加载器中类,是否会造成内存泄漏,在https://www.cnblogs.com/silyvin/articles/10408310.html中有详细讨论

 kettle~.jar 链接: https://pan.baidu.com/s/19uFB9AS0Km1lhufp6LxjsQ 提取码: zwu35

************************************************

ClassNotFoundException 和 NoClassDefError 两个异常,是在 ClassLoader 加载
类出现问题时常常碰到的两个异常,这两个异常的区别在于前者
ClassNotFoundException 是指通过 ClassLoader 加载不到所需 要的类,而 后者
NoClassDefError 是指通过 ClassLoader 已经找到了所需要的类,但找不到该类所依
赖的其他类  
--------------------- 
原文:https://blog.csdn.net/lg70124752/article/details/84445265  

 

 

 

5.6

如果被加载的类有static代码块抛出异常,则会抛出xxxerror给调用方,此时也应用Throwable抓取

转载于:https://www.cnblogs.com/silyvin/p/10274898.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30492601/article/details/97562480

智能推荐

基于JSP后台的志愿者小程序 毕业设计毕设作品欣赏_jsp参赛作品-程序员宅基地

文章浏览阅读767次。基于JSP后台的志愿者小程序_jsp参赛作品

固定资产管理系统日常业务有哪些-程序员宅基地

文章浏览阅读364次,点赞4次,收藏5次。它可以帮助企业完成固定资产的全生命周期管理,提升资产管理效率,降低成本。它涉及公司的长期投资、资产保值和资产报表的准确性。资产处理:当资产达到预定使用期或无法继续使用时,系统需要记录资产处理信息,包括处理日期、处理方法和价格。资产维护:系统需要提醒公司定期维护资产,以确保资产的正常使用。同时,系统还应记录维护的详细信息,包括维护日期、维护内容和维护费用。资产应用:系统需要记录使用单位、使用人员、使用次数等每个资产的使用情况。该系统可实现固定资产的高效管理,提升资产管理效率,降低成本。

android源码--activity启动源码分析_源码 判断启动的activity是否是 instant app-程序员宅基地

文章浏览阅读518次。1.app应用的真正入口是ActivityThread类中的main()方法。 2.调用Looper.prepareMainLooper()方法。 3.调用prepare(false)方法,这里的threadLocal其实就是一个map集合。这样新创建了一个Looper对象,添加到集合中。 在Looper的构造器中,初始化了消息队列并且获取当前的线程 4.调用myLoope..._源码 判断启动的activity是否是 instant app

如何获取Gradle dependencies report(gradle依赖报告)_gradle license dependency report-程序员宅基地

文章浏览阅读1.2k次。这部分内容是之前那个依赖测试包问题看到的答案下面的,有一位大佬梳理了一下这个过程,我在这边翻译一下也供大家参考吧:步骤1在项目根目录下执行获取依赖报告的gradle,比如gradle -q app:dependencies 详细的可以看这里这可以提供与该问题有关的以ASCⅡ码呈现的树,它会帮助你判断哪些是有冲突的版本+--- com.android.support.t..._gradle license dependency report

会动的底部导航栏-Lottie的应用-程序员宅基地

文章浏览阅读415次,点赞5次,收藏4次。随着Android的发展,用户审美的不断提高,你的app不仅得足够好用,UI也得让人感觉赏心悦目,今天无意间打开CSDN看帖子时,发现点击底部导航栏时,图标是会播放动画的,一时好奇是如何实现的,然后就浅浅的研究了下~

centos误删yum,重新安装yum的正确姿势_centos8 误删yum和dnf安装yum和dnf-程序员宅基地

文章浏览阅读3k次。1.针对误卸载yum卸载pythonrpm -qa|grep python|xargs rpm -e --allmatches --nodepswhereis python|xargs rm -fr2.卸载yumrpm -qa|grep yum|xargs rpm -e --allmatches --nodepswhereis yum|xargs rm -fr3.新建一个文..._centos8 误删yum和dnf安装yum和dnf

随便推点

你最大的优点是什么?(回答技巧及范例)-程序员宅基地

文章浏览阅读829次。http://bbs.yingjiesheng.com/thread-186906-1-1.html你最大的优点是什么?问题分析: 在这个问题上, 面试官关注的问题有两点。第一, 申请人没有撒谎, 而是真实地阐述了自己的优点。第二, 他所阐述的优点, 恰好是这个职位所需要的素质。有很多时候, 对于一个岗位而言的优点, 会成为另一个岗位的缺点。比如说, 如果你具备很强的领导能力, 往往不适合..._说说你们最大的优点是什么

软件工程文档编写标准包括哪些内容_工程文档写作都有什么-程序员宅基地

文章浏览阅读1.2k次。在项目开发过程中,应该按要求编写好十三种文档,文档编制要求具有针对性、精确性、清晰性、完整性、灵活性、可追溯性。   ◇ 可行性分析报告:说明该软件开发项目的实现在技术上、经济上和社会因素上的可行性,评述为了合理地达到开发目标可供选择的各种可能实施方案,说明并论证所选定实施方案的理由。   ◇ 项目开发计划:为软件项目实施方案制订出具体计划,应该包括各部分工作的负责人员、开发的进度、开发经费的_工程文档写作都有什么

互联网产品中的平台、社区、软件、网站、品牌等科普_小米社区和oppo社区 谁算是交易型社区-程序员宅基地

文章浏览阅读2k次。科普大杂烩_小米社区和oppo社区 谁算是交易型社区

STL模型分割工具:解放3D打印的尺寸限制_分解stl模型-程序员宅基地

文章浏览阅读334次,点赞6次,收藏5次。STL模型分割工具是一个简单易用的在线应用,无需安装任何软件,只需通过网页浏览器即可操作。_分解stl模型

LeetCode刷题总结(九)29 - 31 -- 二进制倍增,位运算,滑动窗口_leetcode 倍增-程序员宅基地

文章浏览阅读217次。(一)LeetCode29:两数相除暴力做法是循环 x -= y,x为被除数,y为除数,减到 x 小于 y 为止,每减一次计数变量 ++,最后输出计数变量。然而以上这种做法显然是会超时的!!!高级解法是二进制移位倍增,其实这也是计算机实现乘除法的本质。..._leetcode 倍增

三缸活塞泵 三角机器人 路由器盖板模具设计 打印机 烘箱滚筒控制板 变频器盒模具设计 机械臂末端执行器 上料机 无人机 摩托车 装配自动线 电机三维图-程序员宅基地

文章浏览阅读93次。3D digital model drawing of three-degree-of-freedom planetary gearbox Solidworks design with STEP/三自由度行星变速箱3D数模图纸 Solidworks设计 附STEP。STP format of 3D drawing of simple model of three-wheeled motorcycle/摆摊三轮摩托车简易模型3D图纸STP格式。

推荐文章

热门文章

相关标签