NoClassDefFoundError和ClassNotFoundException之间有什么区别?是由什么导致的?| Java Debug 笔记

189 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接

问题: 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 的方法来让程序正常进行。但是我需要更加清楚的认知和理解。

回答

来自www.javaroots.com/2013/02/cla…:

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: 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

文章翻译自Stack Overflow:stackoverflow.com/questions/1…