Java中的ClassNotFoundException

时间:2020-01-09 10:34:59  来源:igfitidea点击:

如果应用程序尝试加载类,但未找到具有指定名称的类,则抛出Java中的ClassNotFoundException。

java.lang.ClassNotFoundException

Java中的ClassNotFoundException是一个已检查的异常,这意味着它是Exception类的子类(而不是RuntimeException的子类)。

如果尝试使用以下方法之一通过其字符串名称在运行时加载类,则会引发此异常。

  • 类Class中的forName方法。
  • 类ClassLoader中的findSystemClass方法。
  • 类ClassLoader中的loadClass方法。

但是找不到带有传递名称的类。

我们可能会遇到java.lang.ClassNotFoundException的一种情况是尝试加载JDBC驱动程序而在类路径中没有require JAR的情况。在以下示例中,尽管ojdbcXXX.jar不在类路径中,但尝试加载oracle驱动程序。

public class ClassNotFoundExceptionExp {
  public static void main(String[] args) {
    try {
      Class.forName("oracle.jdbc.driver.OracleDriver");
    } catch (ClassNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
}

输出:

java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:332)
	at com.theitroad.programs.ClassNotFoundExceptionExp.main(ClassNotFoundExceptionExp.java:6)

如我们所见,由于ClassNotFoundException是已检查的异常,因此try.catch块中包含Class.forName()方法调用。要解决此问题,我们需要确保所需的jar位于类路径中。

我们可能会遇到java.lang.ClassNotFoundException的另一种情况是,应用程序中有许多第三方jar,而这些jar又包含其他jar,在这种情况下,我们可能具有同一个jar的不同版本。例如,在应用程序中,我们具有A.jar和B.jar,而A.jar包含C.1.2.jar,而B.jar则包含C.1.4.jar。

用不同的jar和类加载器在这种情况下抛出的ClassNotFoundException非常难以解决。它通常涉及遍历堆栈跟踪以查找有问题的jar和类,绑定以更改jar的加载顺序,升级jar版本,甚至更改构建文件以从jar中排除某些类。