首页 > 解决方案 > 如何修复 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。

标签: javaswingcompilation

解决方案


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

创建目录结构镜像包结构

  1. 移至./RadioButtonDemo.java_./components/RadioButtonDemo.java
  2. 执行javac ./components/RadioButtonDemo.java
  3. 执行java components.RadioButtonDemo

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

编译时指定输出位置

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

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

如果您指定的不是当前目录,-d那么您需要导航到该位置或在执行时指定类路径(通过-cp、、-classpath--class-pathjava


原问题说明

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

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

应用任一修复后,类文件都会以./components/RadioButtonDemo.class. 现在,当您执行时,java components.RadioButtonDemo您是在告诉 Java 查找并加载components.RadioButtonDemo在类路径上命名的类。类加载器采用该类名并将类文件资源解析为/components/RadioButtonDemo.class. 它找到那个类文件,加载它,名称匹配,一切都很好。


推荐阅读