Difference between ClassNotFoundException Vs NoClassDefFoundError is one popular interview question and most of the Java developers would have come across it. 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 Vs NoClassDefFoundError
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
How to solve ClassNotFoundException in Java
- 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.
- Even if the .jar file is present in the classpath and still getting the exception, then the application’s classpath is getting overridden 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. Let’s 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
How to solveNoClassDefFoundError in Java
- Verify whether all the required class files are present before execution. This is the most common mistake which leads to the NoClassDefFoundError.
- 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