Friday, March 23, 2012

Difference Between ClassNotFoundException & NoClassDefFoundError

Assume the following classes

program
  |-------->Test.java
  |--------->Demo.java

Test.java
----------
public class Test{}


Demo.java
-------------

public class Demo
{
public static void main(String s[])throws Exception
{

Class.forName("Test");  //line 1
Test t=new Test();  //line 2
}
}

Observation
ClassNotFoundException
---------------------------------
You keep only line 1(comment line 2),and compile and execute Demo.java,(Donot compile Test.java)it will give you ClassNotFoundException
What ever String you are passing in Class.forName("---") is a class name,and it should be there
solution:  Compile both the java files and then execute Demo class

NoClassDefFoundError
--------------------------------------
Keep Only line 2(comment line 1),and compile and Execute Demo.java.The program successfully compiles &     Executes.It is because,when ur class Demo is using class Test,then No need to compile Test.java,when you compile Demo.java,it auto compiles Test.java

So when will I get Error?  Just remove . from ur classpath & recompile


In classpath generally we add  ;.  at last.
This is because,when the JVM looks for the classes,it looks in classpath and when it sees .  , it  understands that it has to look in the current working directory also.

But if you remove . from classpath,then here auto-compilation will not take place,means you have to compile all the classfiles using javac *.java.

Even after you have compiled both the classes,if u try to execute it,it will still show you NoClassDefFoundError,because u have removed . from classpath variable


Now comment both line1 & line 2,and again recompile only Demo.java
Compilation will be successful,but While execution it will give you same NoClassDefFoundError


Solution:  include ;.  at your classpath