NoClassDefFoundError 和 ClassNotFoundException 之间的原因和区别是什么?

本教程将介绍NoClassDefFoundError 和 ClassNotFoundException 之间的原因和区别是什么?的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

NoClassDefFoundError 和 ClassNotFoundException 之间的原因和区别是什么? 教程 第1张

问题描述

NoClassDefFoundErrorClassNotFoundException有什么区别?

是什么导致它们被抛出?怎么解决?

在修改现有代码以包含新的 jar 文件时,我经常会遇到这些 throwable.对于通过 webstart 分发的 java 应用程序,我在客户端和服务器端都点击了它们.

我遇到的可能原因:

    客户端代码的 build.xml 中未包含的包

    我们正在使用的新 jar 缺少运行时类路径

    版本与之前的 jar 冲突

当我今天遇到这些问题时,我会采取循序渐进的方法来让事情顺利进行.我需要更多的清晰和理解.

推荐答案

与Java API Specifications的区别如下.

对于 ClassNotFoundException:

当应用程序尝试通过它的字符串加载一个类名称使用:

Class 类中的 forName 方法.

ClassLoader类中的findSystemClass方法.

ClassLoader 类中的loadClass 方法.

    The forName method in class Class.

    The findSystemClass method in class ClassLoader.

    The loadClass method in class ClassLoader.

但没有定义类可以找到指定的名称.

对于 NoClassDefFoundError:

如果 Java 虚拟机或ClassLoader 实例尝试加载在类的定义中(作为一部分正常的方法调用或作为使用 new 创建一个新实例表达式)并且没有定义可以找到类.

搜索到的类定义当前执行时存在类已编译,但定义再也找不到了.

所以,似乎NoClassDefFoundError 发生在成功编译源时,但在运行时,找不到所需的class 文件.这可能是在 JAR 文件的分发或生产中可能发生的事情,其中​​并未包含所有必需的 class 文件.

至于ClassNotFoundException,看来它可能源于试图在运行时对类进行反射调用,但程序试图调用的类并不存在.

两者的区别在于,一个是Error,一个是Exception.NoClassDefFoundError 是一个 Error,它是由 Java 虚拟机在查找它期望找到的类时遇到问题而引起的.由于未找到 class 文件,或者与在编译时生成或遇到的文件不同,因此预期在编译时工作的程序无法运行.这是一个非常严重的错误,因为程序无法由 JVM 启动.

另一方面,ClassNotFoundException 是一个Exception,因此在某种程度上是可以预料的,并且是可以恢复的.使用反射可能容易出错(因为有些期望事情可能不会按预期进行.没有编译时检查以查看所有必需的类是否存在,因此查找所需类的任何问题都会在运行时出现.

好了关于NoClassDefFoundError 和 ClassNotFoundException 之间的原因和区别是什么?的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。