NoClassDefFoundError vs ClassNotFoundException
The difference from the Java API Specifications is as follows.
For
As for
The difference between the two is that one is an
On the other hand, the
For
ClassNotFoundException
:Thrown when an application tries to load in a class through its string name using:For
but no definition for the class with the specified name could be found.
- The
forName
method in classClass
.- The
findSystemClass
method in classClassLoader
.- The
loadClass
method in classClassLoader
.
NoClassDefFoundError
:Thrown if the Java Virtual Machine or aSo, it appears that theClassLoader
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 existed when the currently executing class was compiled, but the definition can no longer be found.
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.As for
ClassNotFoundException
, it appears that it may
stem from trying to make reflective calls to classes at runtime, but the
classes the program is trying to call is does not exist.The difference between the two is that one is an
Error
and the other is an Exception
. With NoClassDefFoundError
is an Error
and it arises from the Java Virtual Machine having problems finding a
class it expected to find. A program that was expected to work at
compile-time can't run because of class
files not being
found, or is not the same as was produced or encountered at
compile-time. This is a pretty critical error, as the program cannot be
initiated by the JVM.On the other hand, the
ClassNotFoundException
is an Exception
,
so it is somewhat expected, and is something that is recoverable. Using
reflection is can be error-prone (as there is some expectations that
things may not go as expected. There is no compile-time check to see
that all the required classes exist, so any problems with finding the
desired classes will appear at runtime.
留言
張貼留言