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中排除某些类。