Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ClassNotFoundException vs NoClassDefFoundError

I have gone through this thread What causes and what are the differences between NoClassDefFoundError and ClassNotFoundException? This is what one of the ans,which has max ups, in thread is : NoClassDefFoundError :"So, it appears that the NoClassDefFoundError occurs when the source was successfully compiled, but at runtime, the required class files were not found. This may be something that can happen in the distribution or production of JAR files, where not all the required class files were included."

ClassNotFoundException : As for ClassNotFoundException, it appears that it may stem from trying to make reflective calls to classes at runtime, but the classes the program is trying to call is does not exist.

I did a small experiment . I created a main class, class A and tried to call other class, class B from it , compiled successfully.

Then i deleted the class B which is being called in class A. I got the java.lang.ClassNotFoundException but as per the answer in the tread, i should have got NoClassDefFoundError (source was compiled succesfully but at runtime class files were not found) Could anyone explain what am i missing in the interpretation of the ans in the thread ?

package com.random;  public class A {      public static void main(String[] args) {         B b= new B();      }  }   package com.random;  public class B {    } 
like image 528
Deen John Avatar asked Feb 04 '15 13:02

Deen John


People also ask

What is a NoClassDefFoundError?

The NoClassDefFoundError is a runtime error in Java that occurs if the Java Virtual Machine (JVM) or a ClassLoader instance attempts to load the definition of a class that could not be found. The class definition exists at compile-time but is not available at runtime.

What is the difference between NoClassDefFoundError?

The difference between the two is that one is an Error and the other is an Exception . With NoClassDefFoundError is an Error and it arises from the Java Virtual Machine having problems finding a class it expected to find.

What is a ClassNotFoundException?

ClassNotFoundException is a checked exception in Java that occurs when the JVM tries to load a particular class but does not find it in the classpath.

What is the difference between ClassNotFoundException and no class def found error in Java?

As the name suggests, ClassNotFoundException is an exception while NoClassDefFoundError is an error. ClassNotFoundException occurs when classpath does not get updated with required JAR files while error occurs when the required class definition is not present at runtime.


1 Answers

NoClassDefFoundError

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.


ClassNotFoundException

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.


You have to understand that the JVM can't realize the definition of the class you deleted can't be found, as the class itself can't be found which automatically throw the ClassNotFoundException.

This exception happen at runtime so it does not matter if it compiled first or not, you deleted the file, therefore it can't be found and throw the exception.

Note that NoClassDefFoundError is not actually an exception, it is an Error derived from LinkageError while ClassNotFoundException derive directly from java.lang.Exception.

To resume, the NoClassDefFoundError globally simply mean that the JVM tried to access at runtime something that according to the compiled code should exists, but does not actually exist (or is not in the classpath).


Example to reproduce ClassNotFoundException

public class ClassNotFoundExceptionExample {      private static final String CLASS_TO_LOAD = "main.java.Utils";      public static void main(String[] args) {         try {             Class loadedClass = Class.forName(CLASS_TO_LOAD);             System.out.println("Class " + loadedClass + " found successfully!");         }         catch (ClassNotFoundException ex) {             System.err.println("A ClassNotFoundException was caught: " + ex.getMessage());             ex.printStackTrace();         }     } } 

Example to reproduce NoClassDefFoundError

Create a simple class Test

public class Test {         public Test() {                 System.out.println("A new instance of the Test class was created!");         } } 

And a class NoClassDefFoundErrorExample

public class NoClassDefFoundErrorExample {         private static Test test = new Test();          public static void main(String[] args) {                 System.out.println("The definition of Test was found!");         } } 

Now create a n executable .jar which execute the main method. You can specify it in the Manifest.txt file inside the .jar

Main-Class: NoClassDefFoundErrorExample 

Now run the following commands

javac Test.java javac NoClassDefFoundErrorExample.java jar cfm NoClassDefFoundErrorExample.jar Manifest.txt NoClassDefFoundErrorExample.class java -jar NoClassDefFoundErrorExample.jar 

Notice the NoClassDefFoundError

Exception in thread "main" java.lang.NoClassDefFoundError: TestClass     at NoClassDefFoundErrorExample.(NoClassDefFoundErrorExample.java:2) Caused by: java.lang.ClassNotFoundException: TestClass     at java.net.URLClassLoader$1.run(URLClassLoader.java:372)     at java.net.URLClassLoader$1.run(URLClassLoader.java:361)     at java.security.AccessController.doPrivileged(Native Method)     at java.net.URLClassLoader.findClass(URLClassLoader.java:360)     at java.lang.ClassLoader.loadClass(ClassLoader.java:424)     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)     at java.lang.ClassLoader.loadClass(ClassLoader.java:357)     ... 1 more 
like image 73
Jean-François Savard Avatar answered Oct 09 '22 06:10

Jean-François Savard