Java中的ClassNotFoundException和NoClassDefFoundError有什么区别?

双方的ClassNotFoundException 和NoClassDefFoundError的 是错误时,JVM或类加载器不能找到合适的类,而在运行时加载。ClassNotFoundException 是已检查的异常,而NoClassDefFoundError 是未检查的错误。

有不同类型的ClassLoader 从不同来源加载类,有时可能会导致库JAR文件丢失或类路径不正确,从而导致加载器无法在运行时加载类。

ClassNotFoundException

ClassNotFoundException的 来当我们试图使用反射来加载在运行时的一类,如果这些类文件丢失,然后应用程序或程序与抛出的ClassNotFoundException 异常。由于它是在运行时加载类的,因此在编译时无需检查。

示例

public class ClassNotFoundExceptionTest {

   public static void main(String[] args) {

      try {

         Class.forName("Test");

      } catch (ClassNotFoundException cnfe) {

         System.err.println("You are trying to search for a class is not existing. "+cnfe);

      }

   }

}

输出结果

You are trying to search for a class is not existing. java.lang.ClassNotFoundException: Test


NoClassDefFoundError

当使用来自类路径的特定类编译了一个类,但是在运行时该类不可用时,将引发NoClassDefFoundError 。缺少JAR文件是获取NoClassDefFoundError的最基本原因。根据Java API文档“在编译当前执行的类时已存在搜索到的类定义,但无法再找到该定义。”

示例

class Test1 {

   public void show() {

      System.out.println("show() method called");

   }

}

public class Test2 {

   public static void main(String[] args) {

      Test1 t = new Test1();

      t.show();

   }

}

当我们编译这两个类时,我们将获得两个类文件Test1.class和Test2.class,而在运行Test2 类时,只需删除Test1.class文件即可,如下所示,我们将获得NoClassDefFoundError 

输出结果

Exception in thread "main" java.lang.NoClassDefFoundError: Test1

         at Test2.main(Test2.java:9)

以上是 Java中的ClassNotFoundException和NoClassDefFoundError有什么区别? 的全部内容, 来源链接: utcz.com/z/316381.html

回到顶部