[b]相同点:[/b]
1、NoClassDefFoundError和ClassNotFoundException都是类运行时出错。
2、都和classpath有关。
[b]不同点:[/b]
1、ClassNotFoundException继承java.lang.Exception,是一种受检异常(checked exception),需要显式地使用try/catch来进行处理。通常需要确保需要的类已经在classpath上了。
--------------------------------
而NoClassDefFoundError继承java.lang.LinkageError,是一种错误(Error)。
2、ClassNotFoundException发生在类加载器在classpath上找不到相关类的时候,通常会使用Class.forName()或ClassLoader.loadClass()或ClassLoader.findSystemClass()。
有时我们会主观地认为类已经在classpath上了,但其实不是,例如jar包中的manifest文件的优先级比当前classpath或-cp选项指定的classpath的优先级都要高,就有可能发生ClassNotFoundException。
还有一种也会发生ClassNotFoundException的场景就是使用两个类加载器,一个类加载器尝试着访问已经被另一个类加载器加载的类也会导致ClassNotFoundException。
--------------------------------
而NoClassDefFoundError相对来说更难诊断出原因。
有时会发生在运行期依赖的类变更了或被删除了,例如下面这个例子,Test类中依赖Test1类,在编译时Test1存在,
[img]http://dl2.iteye.com/upload/attachment/0101/3771/f8980746-9046-3efd-b307-0d5e38590a50.png[/img]
编译成功后,删除Test1.class文件,再运行Test类时,就会报错:
Exception in thread "main" java.lang.NoClassDefFoundError: Test
at Test1.main(Test1.java:5)
Caused by: java.lang.ClassNotFoundException: Test
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 1 more
NoClassDefFoundError还可能发生在类的静态代码块中抛出了异常,例如:
[img]http://dl2.iteye.com/upload/attachment/0101/3774/07e4c260-7f27-31e1-a7e8-bf8b6f84b32c.jpg[/img]
配置文件中没有PROM_REDIS_MAXACTIVE项,是null,导致类的静态代码块出错,从而引起NoClassDefFoundError:
java.lang.NoClassDefFoundError: com.jag.StringSingleCacheClient (initialization failure)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:140)
1、NoClassDefFoundError和ClassNotFoundException都是类运行时出错。
2、都和classpath有关。
[b]不同点:[/b]
1、ClassNotFoundException继承java.lang.Exception,是一种受检异常(checked exception),需要显式地使用try/catch来进行处理。通常需要确保需要的类已经在classpath上了。
--------------------------------
而NoClassDefFoundError继承java.lang.LinkageError,是一种错误(Error)。
2、ClassNotFoundException发生在类加载器在classpath上找不到相关类的时候,通常会使用Class.forName()或ClassLoader.loadClass()或ClassLoader.findSystemClass()。
有时我们会主观地认为类已经在classpath上了,但其实不是,例如jar包中的manifest文件的优先级比当前classpath或-cp选项指定的classpath的优先级都要高,就有可能发生ClassNotFoundException。
还有一种也会发生ClassNotFoundException的场景就是使用两个类加载器,一个类加载器尝试着访问已经被另一个类加载器加载的类也会导致ClassNotFoundException。
--------------------------------
而NoClassDefFoundError相对来说更难诊断出原因。
有时会发生在运行期依赖的类变更了或被删除了,例如下面这个例子,Test类中依赖Test1类,在编译时Test1存在,
[img]http://dl2.iteye.com/upload/attachment/0101/3771/f8980746-9046-3efd-b307-0d5e38590a50.png[/img]
编译成功后,删除Test1.class文件,再运行Test类时,就会报错:
Exception in thread "main" java.lang.NoClassDefFoundError: Test
at Test1.main(Test1.java:5)
Caused by: java.lang.ClassNotFoundException: Test
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 1 more
NoClassDefFoundError还可能发生在类的静态代码块中抛出了异常,例如:
[img]http://dl2.iteye.com/upload/attachment/0101/3774/07e4c260-7f27-31e1-a7e8-bf8b6f84b32c.jpg[/img]
配置文件中没有PROM_REDIS_MAXACTIVE项,是null,导致类的静态代码块出错,从而引起NoClassDefFoundError:
java.lang.NoClassDefFoundError: com.jag.StringSingleCacheClient (initialization failure)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:140)