从字面上来看就是一个是错误一个是异常。以下是JDK文档中的解释。
1)
public class ClassNotFoundExceptionextends Exception
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."
2)
public class NoClassDefFoundError extends LinkageError
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.
首先两个意思都是编译通过,但是运行的时候找不到类定义(class)
ClassNotFoundException
当应用程序以 字符串(类名称) 方式调装载一个类时,而该类的定义(class)无法找到,该异常被抛出,有以下几种情况:
* Class的forName方法
* ClassLoader中的findSystemClass方法
* ClassLoader中的loadClass方法
为了遵循通用的异常链机制,从JDK1.4起,这个异常已经被改造。当构造新对象时可以作为可选异常,并且可以通过getException()方法来获取原因
NoClassDefFoundError
当虚拟机或者ClassLoader尝试装载一个类的定义(该类是作为方法的一部分调用或者是使用new表达式来创建新实例的一部分),但是又无法找到该类定义时抛出
实例代码
public class Main{
//作为方法一部分调用
public static void trigger(){
try{
ThirdPart.name = "edwin";
System.out.println(ThirdPart.name);
}catch(Exception e){
e.printStackTrace();
}
}
//作为构造器(new)的一部分
public Main(){
trigger();
}
public static void main(String[] args){
// 1) trigger();
// 2) Main main = new Main();
}
}
public class ThirdPart{
public static String name;
}
public class Main2{
public static void main(String[] args) {
System.out.print("Hello/t");
try{
Class clazz = Class.forName("ThirdPart");
ThirdPart third = (ThirdPart)clazz.newInstance();
third.name = "edwin";
System.out.println(third.name);
}catch(ClassNotFoundException e){
Throwable t1 = e.getCause();
System.out.println(t1);
Throwable t2 = e.getException();
System.out.println(t2);
}catch(InstantiationException e){
e.printStackTrace();
}catch(IllegalAccessException e){
e.printStackTrace();
}
}
}
Exception in thread "main" java.lang.NoClassDefFoundError: ThirdPart
at Main.main(Main.java:5)
Caused by: java.lang.ClassNotFoundException: ThirdPart
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Exception in thread "main" java.lang.ClassNotFoundException: ThirdPart
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at Main2.main(Main2.java:5)
从异常栈可以看出,在这种情况下,NoClassDefFoundError是对ClassNotFoundException进行的包装
还有一个区别就是Error是不能被捕获的,这应该是JDK的设计机制