如何修复 NoClassDefFoundError?

How to fix NoClassDefFoundError?

我正在尝试 运行 来自官方 Oracle website 的代码来创建一个 GUI。 我将此代码保存在 .java 文件中。我运行命令:

javac RadioButtonDemo.java

没有消息出现。但是当我尝试 运行 程序时,我收到一条错误消息:

C:\Users\User\Documents\Java Projects>java RadioButtonDemo
Error: Could not find or load main class RadioButtonDemo
Caused by: java.lang.NoClassDefFoundError: components/RadioButtonDemo (wrong name: RadioButtonDemo)

为什么 Oracle 官方网站的代码不起作用?我究竟做错了什么?我该如何解决? 我不明白这个!

其他帖子的提示对我没有帮助。减去你想要的一切。

我有 JDK 16.0.1。 Windows10 x64。

RadioButtonDemo class 有一个 package components; 语句。在典型的 Java 中,包由目录表示。所以你至少有两个选择:

创建镜像包结构的目录结构

  1. ./RadioButtonDemo.java 移动到 ./components/RadioButtonDemo.java
  2. 执行javac ./components/RadioButtonDemo.java
  3. 执行java components.RadioButtonDemo

如果您没有指定输出位置(见下文),那么编译器会将 class 个文件放在与相关源文件相同的目录中。

编译时指定输出位置

  1. 执行javac -d <path> ./RadioButtonDemo.java
  2. 执行java components.RadioButtonDemo

<path>甚至可以是当前目录(即.)。当您指定输出位置时,编译器会为您创建镜像结果 class 文件包结构的目录结构。

如果您为 -d 指定当前目录以外的其他位置,则您需要导航到该位置或指定 class 路径(通过 -cp-classpath, or --class-path) 当执行 java.


原始问题的解释

现在,编译器似乎并不关心目录结构——至少,我试验时它并不关心——但是class-加载机制确实 似乎很在意。因此编译器愉快地编译了 RadioButtonDemo.java,尽管它不在名为 components 的目录中,但它(默认情况下)将生成的 class 文件放在与源文件相同的目录中.

当您执行 java RadioButtonDemo 时,您告诉 Java 在 class 路径上查找并加载名为 RadioButtonDemo 的 class。 class 加载程序,至少在当前实现的情况下,采用 class 名称并解析预期的 class 文件资源,即 /RadioButtonDemo.class。它找到 class 文件并加载它。但是 class 文件报告 class 的合格名称实际上是 components.RadioButtonDemo。名称不匹配,因此会引发错误。

应用任一修复程序后,class 文件最终位于 ./components/RadioButtonDemo.class。现在,当您执行 java components.RadioButtonDemo 时,您是在告诉 Java 在 class 路径上查找并加载名为 components.RadioButtonDemo 的 class。 class 加载程序采用 class 名称并将 class 文件资源解析为 /components/RadioButtonDemo.class。它找到 class 文件,加载它,名称匹配,一切都很好。