我经历了这个线程,什么原因以及NoClassDefFoundError和ClassNotFoundException之间有什么区别?
这是线程中具有最大ups的ans之一: NoClassDefFoundError :“因此,似乎 在成功编译源代码时发生
了NoClassDefFoundError ,但是在运行时未找到所需的类文件
。这可能是在分发或生产JAR文件时可能会发生某些情况,其中并未包含所有必需的类文件。”
ClassNotFoundException
:至于ClassNotFoundException,似乎是由于试图在运行时对类进行反射性调用而引起的,但程序尝试调用的类不存在。
我做了一个小实验。我创建了一个主类 A 类,并尝试从中调用其他类 B 类,编译成功。
然后我删除了在类A中被调用的类B。我得到了 java.lang.ClassNotFoundException,
但是按照脚步的答案,我应该有NoClassDefFoundError(源代码已成功编译,但在运行时找不到类文件)谁能解释我在线程中对ans的解释中缺少什么?
package com.random;
public class A {
public static void main(String[] args) {
B b= new B();
}
}
package com.random;
public class B {
}
NoClassDefFoundError
如果Java虚拟机或ClassLoader实例尝试加载类的定义(作为常规方法调用的一部分或使用新表达式创建新实例的一部分)而抛出,则找不到该类的定义。
当前正在编译的类在编译时就存在搜索到的类定义,但是无法再找到该定义。
ClassNotFoundException
当应用程序尝试使用以下方式通过其字符串名称加载类时,抛出该错误:类Class中的forName方法。类ClassLoader中的findSystemClass方法。类ClassLoader中的loadClass方法。
您必须了解,找不到被删除JVM
的定义class
,因为class
找不到自动抛出的本身ClassNotFoundException
。
发生此异常,runtime
因此无论是否先编译都没有关系,您删除了文件,因此找不到它并抛出exception
。
请注意,这NoClassDefFoundError
实际上不是例外,它是Error
从派生LinkageError
而ClassNotFoundException
直接从派生的java.lang.Exception
。
要恢复,NoClassDefFoundError
全局仅表示根据代码应存在但实际上不存在(或不在类路径中)的JVM
尝试访问。runtime``compiled
重现ClassNotFoundException的示例
public class ClassNotFoundExceptionExample {
private static final String CLASS_TO_LOAD = "main.java.Utils";
public static void main(String[] args) {
try {
Class loadedClass = Class.forName(CLASS_TO_LOAD);
System.out.println("Class " + loadedClass + " found successfully!");
}
catch (ClassNotFoundException ex) {
System.err.println("A ClassNotFoundException was caught: " + ex.getMessage());
ex.printStackTrace();
}
}
}
重现NoClassDefFoundError的示例
创建一个简单的类 Test
public class Test {
public Test() {
System.out.println("A new instance of the Test class was created!");
}
}
和一堂课 NoClassDefFoundErrorExample
public class NoClassDefFoundErrorExample {
private static Test test = new Test();
public static void main(String[] args) {
System.out.println("The definition of Test was found!");
}
}
现在创建.jar
执行该main
方法的可执行文件。您可以Manifest.txt
在.jar
Main-Class: NoClassDefFoundErrorExample
现在运行以下命令
javac Test.java
javac NoClassDefFoundErrorExample.java
jar cfm NoClassDefFoundErrorExample.jar Manifest.txt NoClassDefFoundErrorExample.class
java -jar NoClassDefFoundErrorExample.jar
注意NoClassDefFoundError
Exception in thread "main" java.lang.NoClassDefFoundError: TestClass
at NoClassDefFoundErrorExample.(NoClassDefFoundErrorExample.java:2)
Caused by: java.lang.ClassNotFoundException: TestClass
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
一个非常简单的应用程序,API level 24(Android 7.0),试图在实际物理设备上的唯一活动中加载网络视图,在日志中给出以下信息并停止应用程序: 和 和 怎么回事?某种版本/依赖性问题?如何纠正? 用于WebView的XML: WebView代码: 完整项目:https://github.com/qabi/webviewtest
问题内容: 我正在IntelliJ中使用Maven。我有一类使用: pom.xml文件中的Maven依赖项: 我可以做并成功建立。但是当我尝试运行它时,我得到: 错误:java.lang.ClassNotFoundException:org.json.JSONObject 我在这里还有什么想念的吗?谢谢! 问题答案: 将json jar 添加到您的类路径 或使用 或将其添加到您的Maven pom
问题内容: 我正在尝试进行Google Maps活动,但是出现LogCat错误,我的应用程序崩溃了。注册API密钥时,我使用了android提供的编码,所以我不知道为什么它不起作用。我需要帮助解决此问题。 LogCat XML文件 Java文件 问题答案: 在文件中添加这样的内容。
问题内容: 这是我的错误代码。我的已导入为外部罐子。 堆栈跟踪: 问题答案: 这行导致,因为您尚未将文件放置在项目的lib文件夹中。或您尚未设置所需罐子的
我有一个使用本地安装的web开发项目。我正在尝试使用Microsoft的jdbc驱动程序()连接到。 位于我的应用程序构建路径中: 我正在出口它。此外,在Tomcat应用程序目录的< code>lib文件夹中,我还放置了< code>sqljdbc41.jar的副本。 没有编译错误,但是在运行时,当我尝试加载SQL服务器驱动程序时,我会得到以下结果: 以下代码块中引发异常: 我看到很多关于这个话题
问题内容: 因此,我今天在开发Android程序时遇到问题。我有一个将XML字符串转换为Java对象(第三方)的类,并且可以在常规Java项目中正常工作,但是在Android上却收到以下奇怪错误: 我出于明显的原因隐藏了我的应用程序名称和程序包,但我想知道是否有人遇到过此类问题。类在正确的包中,这是我添加的库。我之前引用的其他类也可以进行。还有其他原因抛出吗? 谢谢杰克 问题答案: 这是我目前拥有