【Java】Java命令运行时出现NoClassDefFoundError的原因

在使用命令提示符执行Java时,我遇到了NoClassDefFoundError错误。原因是我错误地输入了类路径或类的完全名称。本文中总结了解决NoClassDefFoundError错误的方法。


环境

Windows10: Windows十
Java version 17.0.3.1: Java 版本17.0.3.1

NoClassDefFoundError 是什么

当Java虚拟机或ClassLoader实例尝试加载类定义但找不到类定义时,将抛出此异常。(基于官方文档)
理解这个说明后,我对类路径和类的完全名称有了更深入的理解。

Java虚拟机是一种虚拟计算机。

用于执行Java程序的软件。它会将使用Java字节码编写的计算机程序解译并转换为该计算机可执行的代码形式以进行执行。

ClassLoader实例是什么?

负责加载类和搜索资源(文件)的对象

一个类的定义是

在编程中,声明一个变量并描述一系列代码,当调用对象的方法或属性时,这些代码会被执行,这被称为“类”或“类的定义”。

总之

NoClassDefFoundError是一种错误,它表示JVM在尝试解释Java字节码(中间代码,在转化为JVM可执行的机器代码之前,经过编译生成的二进制数据)时无法加载待执行的类。

在这里会出现类路径

为什么JVM无法加载类呢?
这是因为需要明确地告诉JVM类在哪里,也就是需要设置类路径。

「クラスパス」とは什么意思?

类路径是Java执行环境用于搜索类和其他源文件的路径。

换句话说,您需要指定类的存在路径并进行执行。

在中文中,类路径的指定方式

在使用java命令时,需要在其后面加上-classpath参数来指定类路径。

> java -classpath <クラスパス>

重要的是,类路径是指包含类的包(文件夹)的父文件夹。
一般来说,包含OO.java文件的文件夹会成为包。当在命令提示符下编译时,该包中也会包含类(OO.class文件)。将该包的父文件夹指定为类路径。

假设C:\…\hoge\fuga\foo.java这个文件的包名是fuga。由于其父文件夹是hoge,所以类路径为C:\…\hoge。

> java -classpath C:\...\hoge

在这里还没有完成。最后需要指定类名。

指定了类路径后,只需指定(完整的)类名就可以了。

假设刚刚那个例子中的 C:\…\hoge\fuga\ 包内有一个 foo.class 文件。在使用java命令指定类时,需要使用完整的类名。完整的类名由“包含文件夹名的包名 + .(点号)+ 类文件名”组成。

> java -classpath C:\...\hoge fuga.foo

参考来源的网站

类NoClassDefFoundError
类的查找方式
类路径的设置

广告
将在 10 秒后关闭
bannerAds