ClassNotFoundException vs NoClassDefFoundError
Though both of these errors are related to missing classes in classpath, main difference between them is in their root cause. ClassNotFoundExcpetion comes when you try to load a class at runtime by using Class.forName() or loadClass() and requested class is not present in classpath for example when you try to load MySQL or Oracle driver class and their JAR is not availabe, while in case of NoClassDefFoundError requested class was present at compile time but not available at runtime. Some time due to exception during class initialization e.g. exception from static block causes NoClassDefFoundError, when failed-to-load class was later referenced by runtime. From last few weeks I have been facing a cluster of ClassNotFoundException and NoClassDefFoundError while setting up a new project in Java. This new Java project has lots of dependency on various jars and some of the jar even contains the same name of file which makes my problem even more problematic. While working with NoClassDefFoundError and ClassNotFoundException I thought to document my experience and I have already shared some on 3 ways to resolve NoClassDefFoundError in Java and how to resolve ClassNotFoundException in Java. in this article though focus will be on similarity and differences between java.lang.ClassNotFoundException and java.lang.NoClassDefFoundError in Java.
NoClassDefFoundError vs ClassNotFoundException
Before seeing the differences between ClassNotFoundException and NoClassDefFoundError let's see some similarities which are main reason of confusion between these two errors:
1) Both NoClassDefFoundError and ClassNotFoundException are related to unavailability of a class at run-time.
2) Both ClassNotFoundException and NoClassDefFoundError are related to Java classpath.
Now let's see the difference between NoClassDefFoundError and ClassNotFoundException :
1) ClassNotFoundException comes in java if we try to load a class at run-time using with Class.forName() or ClassLoader.loadClass() or ClassLoader.findSystemClass() method and requested class is not available in Java. the most of the time it looks like that we have the class in classpath but eventually it turns out to be issue related to classpath and application may not be using classpath what we think it was using e.g. classpath defined in jar's manifest file will take precedence over CLASSPATH or -cp option, for more details see How Classpath works in Java. On the other hand NoClassDefFoundError is little different than ClassNotFoundException, in this case culprit class was present during compile time and let's application to compile successfully and linked successfully but not available during run-time due to various reason.
2) ClassNotFoundException is a checked Exception derived directly from java.lang.Exception class and you need to provide explicit handling for it while NoClassDefFoundError is an Error derived from LinkageError.
3) If you are using ClassLoader in Java and have two class loaders then if a ClassLoader tries to access a class which is loaded by another classloader will result in ClassNoFoundException.
4) ClassNotFoundException comes up when there is an explicit loading of class is involved by providing name of class at runtime using ClassLoader.loadClass(), Class.forName(), while NoClassDefFoundError is a result of implicit loading of class because of a method call from that class or any variable access.
Please let us know if you are aware of any other difference between NoClassDefFoundError and ClassNotFoundException in Java , I would be happy to incorporate those.
Related post :
How to resolve NoClassDefFoundError in Java
How HashMap works in Java?
How Garbage Collection works in Java?
Why String is immutable in Java?
10 practical tips on Java debugging with eclipse
How Synchronization works in Java?
How Classpath works in Java?
Tidak ada komentar:
Posting Komentar