问题: NoClassDefFoundError和ClassNotFoundException之间有什么区别?是由什么导致的?
NoClassDefFoundError和ClassNotFoundException之前的区别是什么?
是什么导致它们被抛出?这些问题我们要怎么样解决?
当我在为了引入新的jar包而修改现有代码的时候,我经常遇到这些异常。在webstart发布的java应用程序的客户端和服务端,我都遇到过这些异常。
我所遇到的问题可能的原因:
- packages not included in build.xml for the client side of code
- runtime classpath missing for the new jars we are using
- version conflicts with previous jar
如今,当我遇到这些问题时,我会采取trail-and-error 的方法来让程序正常进行。但是我需要更加清楚的认知和理解。
回答
来自http://www.javaroots.com/2013/02/classnotfoundexception-vs.html:
ClassNotFoundException:当类加载器在class path下面找不到需要的类时发生。所以,基本上你应该检查你的class path并在class path下面添加类。
NoClassDefFoundError:这更难调试和查找原因。在编译时需要的类是存在的,但是在运行时类被更改或者删除,或者类的静态初始化出现异常,这个异常就会被抛出了。这意味着类加载的时候,该类是存在于classpath中,但是这个类其中所需要的一个类要么被删除了,要么编译器加载失败。所以你应该去看这个类的所依赖的类。
例子:
public class Test1
{
}public class Test
{public static void main(String[] args){Test1 = new Test1(); }}
在编译完这两个类以后,删除test1运行test就会出现异常
Exception in thread "main" java.lang.NoClassDefFoundError: Testat Test1.main(Test1.java:5)
Caused by: java.lang.ClassNotFoundException: Testat 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
文章翻译自Stack Overflow:https://stackoverflow.com/questions/1457863/what-causes-and-what-are-the-differences-between-noclassdeffounderror-and-classn