首先我们来看一下文档中是如何定义的。
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.
如果jvm或者一个ClassLoader的实例尝试去载入一个class的定义内容(普通方法的调用或者用new去创建这个class的实例)但是没有找到这个class的信息。
ClassNotFoundException
Thrown when an application tries to load in a class through its string name using:
The forName method in class Class.
The findSystemClass method in class ClassLoader .
The loadClass method in class ClassLoader.
but no definition for the class with the specified name could be found.
As of release 1.4, this exception has been retrofitted to conform to the general purpose exception-chaining mechanism. The "optional exception that was raised while loading the class" that may be provided at construction time and accessed via the getException() method is now known as the cause, and may be accessed via the Throwable.getCause() method, as well as the aforementioned "legacy method."
当一个应用尝试通过Class.forName("class的名字")去载入这个class的时候,但是却没有找到。
我们只需要去关注比较重要的信息即可。需要注意到的是,NoClassDefFoundError是一个error并非一个异常,而是由LinkageError派生出的,但是ClassNotFoundException则是由ReflectiveOperationException派生的。
通过上面的jdk的文档说明可以很清楚的看出来:
NoClassDefFoundError出现的时机是当你真正使用这个类的信息的时候,当class-path上没有这个类的时候会出现。
ClassNotFoundException出现的时机就是一些反射操作,通过名称在Runtime去动态加载这个类的信息。