NoClassDefFoundError和ClassNotFoundException的区别


往期

NoClassDefFoundError和ClassNotFoundException有什么区别

  • NoClassDefFoundError是一个错误(Error),而ClassNotFoundException是一个异常,Java对于Error和Exception的处理是不同的,我们可以从异常中恢复程序但却不应该从错误中恢复程序;

  • ClassNotFoundException的产生原因

    • Java支持使用反射方式在运行时动态加载类,例如使用Class.forName方法来动态的加载类,可以将类名作为参数传递给上述方法从而将指定类加载到JVM内存中,如果这个类在类路径中没有被找到,那么此时就会在运行时抛出ClassNotFoundException异常
    • 解决该问题需要确保所需的类连同它依赖的包存在于类路径中,常见问题在于类名书写错误
  • NoClassDefFoundError的产生原因

    • 如果JVM或者ClassLoader实例尝试加载(可以通过正常的方法调用,也可能是使用new来创建的对象)类的时候却找不到类的定。要查找的类在编译的时候是存在的,运行的时候却找不到了,这个时候就会导致NoClassDefFoundError
    • 造成该问题的原因可能是打包过程漏掉了部分类,或者jar包出现损坏或者篡改。解决这个问题的办法就是查找那些在开发期间存在于类路径下但在运行期间却不在类路径下的类。
  • ClassNotFoundException代码举例

    • 当使用JDBC去连接数据库的时候,一般会使用反射的方式去加载JDBC的驱动,如果我们没有将驱动放到应用的classpath下,那么会导致运行时找不到类,会抛出ClassNotFoundException异常

    • public class ClassNotFoundExceptionTest {
          public static void main(String[] args) {
              try {
                  // 使用反射获取Driver实现类对象
                  Class<?> clazz = Class.forName("com.mysql.jdbc.Driver");
              } catch (ClassNotFoundException e) {
                  e.printStackTrace();
              }
          }
      }
      
    • 输出:

    • java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
      	at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
      	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
      	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
      	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.Test.ClassNotFoundExceptionTest.main(ClassNotFoundExceptionTest.java:11)
      
  • NoClassDefFoundError代码举例

    • 首先创建一个TestClass,然后编译以后,将TestClass产生的TestClass.class文件删除,然后执行程序

    • public class NoClassDefFoundTest {
          public static void main(String[] args) {
              TestClass testClass = new TestClass();
          }
      }
      
      class TestClass{
      
      }
      
    • 输出:

    • Exception in thread "main" java.lang.NoClassDefFoundError: com/Test/TestClass
      	at com.Test.NoClassDefFoundTest.main(NoClassDefFoundTest.java:9)
      Caused by: java.lang.ClassNotFoundException: com.Test.TestClass
      	at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
      	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
      	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
      	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
      	... 1 more
      

总结

ClassNotFoundExceptionNoClassDefFoundError
继承自java.lang.Exception继承自java.lang.Error
当动态加载Class的时候在类路径中找不到时会抛出此异常如果某个类在编译时是存在的,但运行时找不到这个类的定义时JVM就会抛出该错误
一般在执行Class.forName()、ClassLoader.findSystemClass()、ClassLoader.loadClass()的时候抛出由JVM的运行时系统抛出

Reference

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页