NoClassDefFoundError 和 ClassNotFoundException 有什么区别
类的加载分为显式加载(用字符串为类名加载类,抛出ClassNotFoundException)和隐式加载(不是通过显式方法调用,由引用、实例化或继承导致装入类。通常这种错误在编译阶段会发现,报错为找不到符号。如果编译时能找到这个类,但运行时找不到这个类,就抛出NoClassDefFoundError)
官方文档解释如下:
————————————————
ClassNotFoundException:
- Thrown when an application tries to load in a class through its
- string name using:
- 类 Class 中的 forName() 方法。
- 类 ClassLoader 中的 findSystemClass() 方法。
- 类 ClassLoader 中的 loadClass() 方法。
- but no definition for the class with the specified name could be found.
————————————————
NoClassDefFoundError:
- Thrown if the Java Virtual Machine or a
ClassLoader
instance - tries to load in the definition of a class (as part of a normal method call
- or as part of creating a new instance using the
new
expression) - and no definition of the class could be found.
- The searched-for class definition existed when the currently
- executing class was compiled, but the definition can no longer be
- found.
比如:用maven的pom文件里引用了A.jar,这个A.jar需要依赖B.jar,但你只写了A.jar,没写B.jar,就会出现NoClassDefFoundError。 例子:java.lang.NoClassDefFoundError: org/apache/commons/beanutils/PropertyUtils
简单总结下区别:
1、NoClassDefFoundError 是Error 异常 ,然而ClassNotFoundException是检查异常
2、NoClassDefFoundError 是在编译阶段发生,ClassNotFoundException是在运行期,Class.forName()、ClassLoader.findSystemClass()和ClassLoader.loadClass()的时候可能会发生
3、当应用运行时没有找到对应的引用,则会抛出java.lang.NoClassDefFoundError
还有哪些区别:
NoClassDefFoundError是一个错误(Error),而ClassNOtFoundException是一个异常,在Java中对于错误和异常的处理是不同的,我们可以从异常中恢复程序但却不应该尝试从错误中恢复程序。
ClassNotFoundException的产生原因:
Java支持使用Class.forName方法来动态地加载类,任意一个类的类名如果被作为参数传递给这个方法都将导致该类被加载到JVM内存中,如果这个类在类路径中没有被找到,那么此时就会在运行时抛出ClassNotFoundException异常。
ClassNotFoundException的产生原因:
Java支持使用Class.forName方法来动态地加载类,任意一个类的类名如果被作为参数传递给这个方法都将导致该类被加载到JVM内存中,如果这个类在类路径中没有被找到,那么此时就会在运行时抛出ClassNotFoundException异常。
ClassNotFoundException的产生原因主要是:
Java支持使用反射方式在运行时动态加载类,例如使用Class.forName方法来动态地加载类时,可以将类名作为参数传递给上述方法从而将指定类加载到JVM内存中,如果这个类在类路径中没有被找到,那么此时就会在运行时抛出ClassNotFoundException异常。
解决该问题需要确保所需的类连同它依赖的包存在于类路径中,常见问题在于类名书写错误。
另外还有一个导致ClassNotFoundException的原因就是:当一个类已经某个类加载器加载到内存中了,此时另一个类加载器又尝试着动态地从同一个包中加载这个类。通过控制动态类加载过程,可以避免上述情况发生。
NoClassDefFoundError产生的原因在于:
如果JVM或者ClassLoader实例尝试加载(可以通过正常的方法调用,也可能是使用new来创建新的对象)类的时候却找不到类的定义。要查找的类在编译的时候是存在的,运行的时候却找不到了。这个时候就会导致NoClassDefFoundError.
造成该问题的原因可能是打包过程漏掉了部分类,或者jar包出现损坏或者篡改。解决这个问题的办法是查找那些在开发期间存在于类路径下但在运行期间却不在类路径下的类。