• java.lang.NoClassDefFoundError类似这种错误catch expection是捕获不到的异常


    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>
    

    [INFO] +- ch.qos.logback:logback-classic:jar:1.2.3:compile
    [INFO] | +- ch.qos.logback:logback-core:jar:1.2.2:compile
    [INFO] | - org.slf4j:slf4j-api:jar:1.7.25:compile

    形成:

     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抓取

  • 相关阅读:
    开源项目之Android StandOut(浮动窗口)
    小智慧7
    安卓学习
    asp.net学习Request和Response的其他属性
    bash中的转义
    POJ 1833 排列
    Django点滴(四)ORM对象存取
    POJ 1681 Painter's Problem
    linux2.6.32在mini2440开发板上移植(21)之WebServer服务器移植
    [gkk传智]static与多态及向下向上转型,及多态调用总结
  • 原文地址:https://www.cnblogs.com/silyvin/p/10274898.html
Copyright © 2020-2023  润新知