当在运行时找不到特定的类时,将发生ClassNotFoundException和NoClassDefFoundError。但是,它们发生在不同的情况下。
ClassNotFoundException
NoClassDefFoundError
当您尝试在运行时使用Class.forName()或loadClass()方法加载类并且在类路径中找不到所提到的类时,ClassNotFoundException是发生异常。
Class.forName()
loadClass()
NoClassDefFoundError是在编译时存在某个特定类但在运行时丢失该类时发生的错误。
ClassNotFoundException是运行时异常,当应用程序尝试使用Class.forName()或loadClass()或findSystemClass()方法在运行时加载类时抛出 ,并且在类路径中找不到具有指定名称的类。例如,当您尝试连接到MySQL或Oracle数据库并且尚未使用必需的JAR文件更新类路径时,可能遇到了此异常。在大多数情况下,当您尝试运行应用程序而不用必需的JAR文件更新类路径时,就会发生此异常。
findSystemClass()
例如,如果在类路径中找不到提到的类“ oracle.jdbc.driver.OracleDriver”,则下面的程序将引发ClassNotFoundException 。
“ oracle.jdbc.driver.OracleDriver”
public class MainClass { public static void main(String[] args) { try { Class.forName("oracle.jdbc.driver.OracleDriver"); }catch (ClassNotFoundException e) { e.printStackTrace(); } } }
如果您运行上述程序而未使用必需的JAR文件更新类路径,则将出现类似于以下的异常:
java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver at java.net.URLClassLoader.findClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) at pack1.MainClass.main(MainClass.java:17)
NoClassDefFoundError是Java运行时系统尝试加载类的定义时抛出的错误,并且该类定义不再可用。所需的类定义在编译时出现,但在运行时丢失。例如,编译下面的程序。
class A { // some code } public class B { public static void main(String[] args) { A a = new A(); } }
当您编译上述程序时,将生成两个.class文件。一个是A.class,另一个是B.class。如果删除A.class文件并运行B.class文件,则Java Runtime System将抛出NoClassDefFoundError,如下所示:
Exception in thread "main" java.lang.NoClassDefFoundError: A at MainClass.main(MainClass.java:10) Caused by: java.lang.ClassNotFoundException: A 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)
回顾
原文链接:http://codingdict.com