如何修复 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 中,包由目录表示。所以你至少有两个选择:
创建镜像包结构的目录结构
- 将
./RadioButtonDemo.java
移动到 ./components/RadioButtonDemo.java
- 执行
javac ./components/RadioButtonDemo.java
- 执行
java components.RadioButtonDemo
如果您没有指定输出位置(见下文),那么编译器会将 class 个文件放在与相关源文件相同的目录中。
编译时指定输出位置
- 执行
javac -d <path> ./RadioButtonDemo.java
- 执行
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 文件,加载它,名称匹配,一切都很好。
我正在尝试 运行 来自官方 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 中,包由目录表示。所以你至少有两个选择:
创建镜像包结构的目录结构
- 将
./RadioButtonDemo.java
移动到./components/RadioButtonDemo.java
- 执行
javac ./components/RadioButtonDemo.java
- 执行
java components.RadioButtonDemo
如果您没有指定输出位置(见下文),那么编译器会将 class 个文件放在与相关源文件相同的目录中。
编译时指定输出位置
- 执行
javac -d <path> ./RadioButtonDemo.java
- 执行
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 文件,加载它,名称匹配,一切都很好。