Difference Between ClassNotFoundException Vs NoClassDefFoundError In Java

ClassNotFoundException  and  NoClassDefFoundError are the most popular exceptions in Java which almost all the Java developers would have come across. Both ClassNotFoundException and NoClassDefFoundError occurs when a particular class is not found during the run time, but at different scenarios ClassNotFoundException occurs when you try to load a class dynamically using Class.forName() or ClassLoader.loadClass() or ClassLoader.findSystemClass() methods while the NoClassDefFoundError  occurs when the class is found during the compile time but not at the run time. In this tutorial lets clearly understand the difference between ClassNotFoundException vs NoClassDefFoundError in Java.

ClassNotFoundException in Java :

The ClassNotFoundException in Java occurs while dynamically loading a class using Class.forName() or ClassLoader.loadClass() or ClassLoader.findSystemClass(). Most of the times this exeception occurs when we miss to update the Classpath with the required Jars. Suppose when we try connect to a database using JDBC then we need to update the classpath with the database driver JARs

public class JavaJDBC
{
    public static void main(String[] args)
    {
        try
        {
            Class.forName("com.mysql.jdbc.Driver");
        }
        catch (ClassNotFoundException e) 
        {
            System.out.println("MySQL Driver Missing!!!");
            e.printStackTrace();
            return;
        }
    }
}

In the above code if we missed to register the mysql-connector-java.jar to the classpath then we we will be getting the ClassNotFoundException like below

Difference Between ClassNotFoundException Vs NoClassDefFoundError

How to solve ClassNotFoundException in Java

  1. Check whether the required class is exact and the corresponding .jar file exists in the classpath, if the .jar is not present then add it.
  2. Even if the .jar file is present in the classpath and still getting the exception, then the application’s classpath is getting overriden you must find the exact classpath used by your application

NoClassDefFoundError In Java :

NoClassDefFoundError in Java occurs when we attempt to load a java class which is found during the compile time but not present during runtime. Lets look into the below scenario, we have two classes Test1 and Test2.

class Test1
{
     public void disp()
     {
         System.out.println("disp method called");
     }
}
 
public class Test2
{
    public static void main(String[] args)
    {
        Test1 t = new Test1();
        t.disp();
    }
}

When we compile both the classes we will be getting two class files Test1.class and Test2.class, while running Test2 class just remove the Test1.class file then we will be getting NoClassDefFoundError like below

NoClassDefFoundError In Java

How to solveNoClassDefFoundError in Java

  1. Verify whether all the required class files are present before execution. This is the most common mistake which leads to the NoClassDefFoundError.
  2. Check the classpath pointed by the application is correct and not overridden, try to give the classpath explicitly with -classpath option like below
java -classpath <location of the classfile> <classfile name>
java -classpath . Test2

Difference Between ClassNotFoundException Vs NoClassDefFoundError In Java

ClassNotFoundException NoClassDefFoundError
ClassNotFoundException is a checked Exception it extends java.lang.Exception class NoClassDefFoundError is an Error it extends java.lang.LinkageError class
ClassNotFoundException occurs when the application tries to load a class dynamically which is not present in the classpath. NoClassDefFoundError occurs when the class is found during the compile time but not at the run time
ClassNotFoundException occurs by the explicit loading of the class through Class.forName() or ClassLoader.loadClass() or ClassLoader.findSystemClass() NoClassDefFoundError occurs as a result of implicit loading of class due to a method call or while accessing a other class variable

Leave a Reply

Your email address will not be published. Required fields are marked *