What causes and what are the differences between NoClassDefFoundError and ClassNotFoundException?

前端 未结 15 2356
忘了有多久
忘了有多久 2020-11-21 05:27

What is the difference between NoClassDefFoundError and ClassNotFoundException?

What causes them to be thrown? How can they be resolved?

15条回答
  •  说谎
    说谎 (楼主)
    2020-11-21 05:55

    From http://www.javaroots.com/2013/02/classnotfoundexception-vs.html:

    ClassNotFoundException : occurs when class loader could not find the required class in class path. So, basically you should check your class path and add the class in the classpath.

    NoClassDefFoundError : this is more difficult to debug and find the reason. This is thrown when at compile time the required classes are present, but at run time the classes are changed or removed or class's static initializes threw exceptions. It means the class which is getting loaded is present in classpath, but one of the classes which are required by this class are either removed or failed to load by compiler. So you should see the classes which are dependent on this class.

    Example:

    public class Test1
    {
    }
    
    
    public class Test 
    {
       public static void main(String[] args)
       {
            Test1 = new Test1();    
       }
    
    }
    

    Now after compiling both the classes, if you delete Test1.class file and run Test class, it will throw

    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
    

    ClassNotFoundException: thrown when an application tries to load in a class through its name, but no definition for the class with the specified name could be found.

    NoClassDefFoundError: thrown if the Java Virtual Machine tries to load in the definition of a class and no definition of the class could be found.

提交回复
热议问题