NoClassDefFoundError与ClassNotFoundException的区别在哪?
NoClassDefFoundError是一个错误,而ClassNotFoundException是一个异常,在java中,对错误和异常的处理是不同的,我们可以从异常中恢复程序,但却不应该从错误中恢复程序。
1、ClassNotFoundException
Java支持使用反射方式在运行时动态加载类,例如Java支持使用Class.forName方法来动态地加载类,任意一个类的类名如果被作为参数传递给这个方法,都将导致该类被加载到JVM内存中,如果这个类在类路径中没有被找到,那么此时就会在运行时抛出ClassNotFoundException。
解决该问题需要确保所需的类连同它依赖的包存在于类路径中,还有就是,确保类名的书写正确。
另外导致ClassNotFoundException情况就是:当一个类已经某个类加载器加载到内存中了,此时另有一个类加载器又尝试动态地从一个包中加载这个类,造成加载冲突。可以通过控制动态类加载过程,避免该情况发生。
2、NoClassDefFoundError
如果JVM或者ClassLoader实例尝试加载(可以通过正常的方法调用,也可能是使用new来创建新的对象)类的时候,却找不到类的定义。简单地说,就是类在编译地时候是存在的,运行时却找不到了。这个时候就会导致NoClassDefFoundError。
造成该问题的原因可能是打包的过程中漏掉了分类,或者jar包出现了损坏或者篡改。明白之后,解决的办法也自然明了。