java - 如何修复 NoClassDefFoundError?
问题描述
我正在尝试从 Oracle 官方网站运行代码来创建 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。视窗 10 x64。
解决方案
该类RadioButtonDemo
有一个package components;
声明。在典型的 Java 中,包由目录表示。所以你至少有两个选择:
创建目录结构镜像包结构
- 移至
./RadioButtonDemo.java
_./components/RadioButtonDemo.java
- 执行
javac ./components/RadioButtonDemo.java
- 执行
java components.RadioButtonDemo
如果您没有指定输出位置(见下文),那么编译器会将类文件放在与相关源文件相同的目录中。
编译时指定输出位置
- 执行
javac -d <path> ./RadioButtonDemo.java
- 执行
java components.RadioButtonDemo
<path>
甚至可以是当前目录(即).
。当您指定输出位置时,编译器会为您创建镜像生成的类文件的包结构的目录结构。
如果您指定的不是当前目录,-d
那么您需要导航到该位置或在执行时指定类路径(通过-cp
、、-classpath
或--class-path
)java
。
原问题说明
现在,编译器似乎并不关心目录结构——至少,当我进行实验时它并不关心——但类加载机制似乎确实关心。RadioButtonDemo.java
因此,尽管编译器不在名为 的目录中,但它还是很高兴地编译了它components
,但它(默认情况下)将生成的类文件与源文件放在同一目录中。
当您执行时,java RadioButtonDemo
您是在告诉 Java 查找并加载RadioButtonDemo
在类路径上命名的类。类加载器,至少在当前实现的情况下,采用该类名并解析预期的类文件资源,即/RadioButtonDemo.class
. 它找到该类文件并加载它。但是类文件报告该类的限定名称实际上是components.RadioButtonDemo
. 名称不匹配,因此会引发错误。
应用任一修复后,类文件都会以./components/RadioButtonDemo.class
. 现在,当您执行时,java components.RadioButtonDemo
您是在告诉 Java 查找并加载components.RadioButtonDemo
在类路径上命名的类。类加载器采用该类名并将类文件资源解析为/components/RadioButtonDemo.class
. 它找到那个类文件,加载它,名称匹配,一切都很好。
推荐阅读
- javascript - Swift,使用 SwiftSoup 访问多个类以解析 HTML 文件
- android - 在 Android 4.4 及更高版本的服务中使用 Smsmanager 发送短信
- python - 气流无法从数据流中获取成功状态
- sql - 如何根据选择查询自定义列输出
- java - int[] 到 Hashset (Java)
- jquery - 如何将一组视频容器中的每个按钮与其视频相关联?
- hibernate - 使用 Hibernate 3.6.10 的 CriteriaQuery
- for-loop - SIMULINK:对工作区中数组的每个元素重复子系统并重新组合信号
- javascript - 尝试使用第一个数组的子集“交叉”两个数组并在可能的情况下保持第二个数组的顺序
- sql - 通过使用 DECODE 函数,将日期更改为任何字符串?