zoukankan      html  css  js  c++  java
  • ClassNotFoundException和 NoClassDefFoundError区别验证

    首先NoClassDefFoundError是一个错误,而ClassNotFoundException是一个异常

    NoClassDefFoundError产生的原因:

    如果JVM或者Classloader实例尝试加载类(或者new创建对象)却找不到类的定义,要查找的类在编译时期是存在,运行期间却找不到该对象对应的类,这个时候就会导致NoClassDeFoundError错误。

    NoClassDeFountError三种解决方法:

    1、首先是类在运行的时候依赖于其它的一个jar包,但是该jar包没有加载到classpath中或者是该jar包的名字被其他人改了,就像我的一个例子tibo.jar改为了tibco_v3.jar

    2、运行的类不在classpath中,这个问题没有一个确定的方法去知道,但是很多时候你可以通过System.getproperty(java.classpath)方法,该方法能让你至少可以领略到实际存在的运行期间的classpath

     

    ClassNotFoundException产生原因:

    Java支持使用Class.forName方法来动态加载类,任意一个类的类名可以通过参数传递将该类加载到JVM内存中,如果该类的路径没有被找到,这个时候就会抛出ClassNotFoundException

    ClassNotFoundException的解决方法:

    确保所需的类连同它的依赖包存在于类路径中。

     

    总结:NoClassDefFoundError是程序在编译时期可以顺利找到所依赖的类,但是在运行时找不到或者找到多个类就会抛出该ErrorClassNotFoundException是类路径错误,或者类名称发生更改。

    在生产环境出现的原因通常是由于依赖jar包多版本存在,或者jar包升级类或者方法不再提供。

     

    package jesse.test;
    
    import java.util.Scanner;
    
    public class TestClassAboutException {
     
        public static void main(String[] args) {
            System.out.println("---》》》TestClassAboutException编译已经通过啦!!!");
            toShowClassNotFoundException();
            toShowNoClassDefErr();
    
        }
    
        public static  void  toShowClassNotFoundException(){
            try {
                //"jesse.test.TestClassAboutException"
                // 模拟jar包路劲改变或者,类名称改变引起的ClassNotFoundException
                Class cl = Class.forName("test.TestClassAboutException");// TestClassAboutException.class.getName()
                System.out.println("---》》》toShowClassNotFoundException ::: "+cl.getName());
            } catch (ClassNotFoundException e) {
                System.out.println("---》》》ClassNotFoundException 被捕捉到啦!!!");
                e.printStackTrace();
            }
        }
    
        public static  void toShowNoClassDefErr(){
            try {
                B bS = new B();
            } catch (Throwable e) {
                e.printStackTrace();
            }
            B b = new B();
        }
    }
    

     

     

    package jesse.test;
    
    public class B {
        
        static{
            init();
        }
        
        public B(){}
        
        public static void init(){
            System.out.println("B init and then Exception occurred");
            int res = 5/0;
            System.out.println(res);
        }
    }

    由于编译成功之后有B.class文件,但是在运行时无法找到B类,所以会报NoClassDefFoundError.

     

     

     

  • 相关阅读:
    NSURLConnection与NSURLSession的区别
    微信支付流程
    支付宝支付流程
    配置openfire问题(Oracle)
    id和instancetype
    数组和集合
    静态变量,静态常量以及全局变量
    内存的那些事
    Block循环引用解析
    线程的几个小问题
  • 原文地址:https://www.cnblogs.com/atomicbomb/p/9933636.html
Copyright © 2011-2022 走看看