gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:57:09 25 4
gpt4 key购买 nike

NoClassDefFoundErrorClassNotFoundException 有什么区别?

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

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

我遇到的可能原因:

  1. 客户端代码的 build.xml 中未包含的包
  2. 我们正在使用的新 jar 缺少运行时类路径
  3. 版本与之前的jar冲突

当我今天遇到这些问题时,我会采取试错法来让事情正常进行。我需要更多的清晰度和理解力。

最佳答案

与Java API规范的区别如下。

对于 ClassNotFoundException :

Thrown when an application tries to load in a class through its string name using:

  • The forName method in class Class.
  • The findSystemClass method in class ClassLoader.
  • The loadClass method in class ClassLoader.

but no definition for the class with the specified name could be found.

对于 NoClassDefFoundError :

Thrown if the Java Virtual Machine or a ClassLoader instance tries to load in the definition of a class (as part of a normal method call or as part of creating a new instance using the new expression) and no definition of the class could be found.

The searched-for class definition existed when the currently executing class was compiled, but the definition can no longer be found.

因此,看起来 NoClassDefFoundError 发生在源代码成功编译时,但在运行时,找不到所需的 class 文件。这可能发生在 JAR 文件的分发或生成过程中,其中并未包含所有必需的 class 文件。

至于ClassNotFoundException,看起来可能源于在运行时尝试对类进行反射调用,但程序尝试调用的类不存在。

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

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

关于java - NoClassDefFoundError 和 ClassNotFoundException 之间的原因和区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53872557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com