Introduction
I will show an example on ClassNotFoundException
vs NoClassDefFoundError
. ClassNotFoundException
is an exception whereas, NoClassDefFoundError
is an error. I will discuss the difference between ClassNotFoundException
and NoClassDefFoundError
with examples.
ClassNotFoundException
ClassNotFoundException
is 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.
but no definition for the class with the specified name could be found.
For ClassNotFoundException
, it appears that it may stem from trying to make reflective calls to classes at runtime, but classes the program is trying to call do not exist.
ClassNotFoundException
is an Exception, so it is somewhat expected, and is something that is recoverable.
Example
package com.roytuts.classexception;
public class ClassNotFoundExceptionTest {
public static void main(String[] args) {
try {
Class.forName("ClassA"); //No definition for ClassA exists
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Output
By executing the above program you will see below output:
java.lang.ClassNotFoundException: ClassA
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at com.roytuts.classexception.ClassNotFoundExceptionTest.main(ClassNotFoundExceptionTest.java:7)
NoClassDefFoundError
NoClassDefFoundError is thrown if the
Java Virtual Machine or a Class Loader 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 exist when the currently executing class was compiled, but the definition can no longer be found.
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.
NoClassDefFoundError
is an Error and it arises from the Java Virtual Machine having problems finding a class it expected to find.
Example
package com.roytuts.classexception;
import javax.jms.ConnectionFactory;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
public class NoClassDefFoundErrorTest {
public static void main(String[] args) {
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_BROKER_URL);
}
}
Output
By executing the above class you will see below output:
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
ConnectionFactory cannot be resolved to a type
ActiveMQConnectionFactory cannot be resolved to a type
ActiveMQConnection cannot be resolved to a variable
at com.roytuts.classexception.NoClassDefFoundErrorTest.main(NoClassDefFoundErrorTest.java:11)
Related Posts:
Similarities
Both NoClassDefFoundError
and ClassNotFoundException
are related to unavailability of a class at run-time.
Both ClassNotFoundException
and NoClassDefFoundError
are related to Java classpath.
That’s all about ClassNotFoundException and NoClassDefFoundError.