java.lang.NoClassDefFoundError

java.lang.NoClassDefFoundError 是当在类路径中找不到所需类时丢弃的运行时错误,因此 JVM 无法将其加载到内存中。

java.lang.NoClassDefFoundError

  • NoClassDefFoundError 是一个运行时错误,所以它超出了我们的应用范围来预测和从中恢复
  • java.lang.NoClassDefFoundError 是一个运行时错误,它从来没有在编译时间
  • 很容易对 NoClassDefFoundError 进行调试,因为它清楚地表示 JVM 无法找到所需的类,所以检查类路配置以确保所需的类不被错过

NoClassDefFoundError 类图表

Below image shows NoClassDefFoundError class diagram and it's super classes. java lang NoClassDefFoundError Class Diagram As you can see that it's super classes are Throwable and Error.

java.lang.NoClassDefFound错误的原因

让我们先尝试复制一个场景,在运行时我们会得到NoClassDefFoundError。

 1public class Data {
 2
 3    private int id;
 4
 5    public int getId() {
 6    	return id;
 7    }
 8
 9    public void setId(int id) {
10    	this.id = id;
11    }
12    
13}

请注意,上述类不依赖于任何其他自定义的Java类,它只使用Java内置的类,让我们创建另一个类,该类将在同一目录中使用数据类。

1public class DataTest {
2
3    public static void main(String[] args) {
4    	Data data = new Data();
5    	data.setId(10);
6    	System.out.println("Data Id = "+data.getId());
7    }
8
9}

现在,让我们编译 DataTest 类,然后如下所示执行。

1pankaj:temp pankaj$ ls
2Data.java	DataTest.java
3pankaj:temp pankaj$ javac DataTest.java 
4pankaj:temp pankaj$ ls 
5Data.class	Data.java	DataTest.class	DataTest.java
6pankaj:temp pankaj$ java DataTest
7Data Id = 10
8pankaj:temp pankaj$

到目前为止,一切都很好,现在让我们将数据类文件移动到另一个地方,然后尝试执行DataTest类。

 1pankaj:temp pankaj$ mv Data.java Data.class ../
 2pankaj:temp pankaj$ ls
 3DataTest.class	DataTest.java
 4pankaj:temp pankaj$ java DataTest
 5Exception in thread "main" java.lang.NoClassDefFoundError: Data
 6    at DataTest.main(DataTest.java:5)
 7Caused by: java.lang.ClassNotFoundException: Data
 8    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
 9    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
10    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
11    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
12    ... 1 more
13pankaj:temp pankaj$

Here it is, we got NoClassDefFoundError because java runtime is unable to find Data class as clearly shown in the exception stack trace. Below image shows all the above commands and output in the terminal window. java.lang.NoClassDefFoundError example

如何解决 java.lang.NoClassDefFoundError?

从上面的例子中,我们可以清楚地识别出这个错误的唯一原因是,所需的类在编译时可用,但不是在运行时可用。

  • 联合国 检查例外堆栈跟踪, 确切知道哪个类丢出错误, 哪个是java没有找到的类 。
  • 下一步是寻找类路径配置,有时我们在 Eclipse 或其他环境中编译我们的课程,并在其他环境中运行,我们可以错过类路径配置. 例如, 我可以轻松地将包含数据类的目录添加到下面的类路径中。 QQ pankaj: temp pankaj$ java - classpath : 。 数据测试 数据 Id = 10 pankaj:temp QQ 记得我早些时候将数据类移到上一个目录. () ( )* 大多数时候,NoClassDeffound 错误出现在一些服务器上运行的应用程序作为[web应用程序](/community/tutoris/java-web-application-tutorial- for-beginners)或网络服务,在这种情况下检查所需罐子是否是WAR文件的一部分. 例如,在下方的 maven 配置不会在生成 WAR 文件时包入 bar 文件 。 () ) QQ <依赖性>(- ) javax. servlet (- ) servlet-api (- ) 3.0.1 (- ) < scope > > 提供 (- ) (- )> 但我们需要它来创建基于网络的[serlet](/commet/tures/ servlettutori-java)应用程序,通常这个罐总是Tomcat或任何其他应用程序服务器的一部分. (- (英语)

我希望你能在这个错误发生时找到足够的想法,以及如何轻松修复它。参考: API Doc, Java 中的例外处理

Published At
Categories with 技术
Tagged with
comments powered by Disqus