我该如何解决ClassNotFoundException错误?

163

我试图运行一个Java应用程序,但是遇到了这个错误:

java.lang.ClassNotFoundException:

冒号后面跟着缺失的类所在的位置。然而,我知道该位置不存在,因为该类位于其他地方。我如何更新该类的路径?与类路径有关吗?


2
你必须将缺失类的jar文件添加到类路径中。 - Crom
如果你的类有一个包,那么请进入包含该类的文件夹。例如,如果包名为test.abc,则先进入test文件夹,然后执行java -cp . test.abc.CLASSNAME(不需要加上.class后缀)。如果没有包,则直接进入包含该类的文件夹,然后执行java -cp . CLASSNAME。 - Optional
可能是某个类没有被部署到您的运行时环境中(例如缺少jar包),或者该类在给定的类加载器中不可见。请使用此工具对这些问题进行故障排除:http://jhades.org - Angular University
7
有时我也会遇到这种情况。这个异常明显违反了在异常消息中说明所有必要上下文的规则。它应该提到在哪里尝试查找该项,你的类路径上有什么。请改进异常消息。不要让我们去寻找可以帮助解决问题的信息。 - masterxilo
我不知道你是否犯了和我一样的愚蠢错误,但是在运行java ClassName.class时,请改为运行java ClassName。有时候自动补全会给出.\ClassName,请将其中的.\删除。 - Jerry wu
29个回答

0
如果您添加了多个(第三方)库和扩展应用程序类,则可能会出现问题。为此,您需要将multiDexEnabled true设置为并将扩展的Application类替换为MultiDexApplication。这样就可以解决问题了。

0

如果你把项目移动到新机器上或者从Git导入,可以尝试以下方法:

  1. 右键点击类 > 运行为 > 运行配置
  2. 删除主类的引用
  3. 应用 > 关闭
  4. 现在再次右键点击类 > 运行为Java应用程序。

这对我很有效。


0

我在终端上运行了Java代码,并且添加类路径是这样的解决方案:
> java -cp <JAR文件> <JAVA类文件>
例如, c:\code\prototype-app\target\classes>java -cp ..\prototype-app-1.0-SNAPSHOT.jar com_stree.app.DetectLabels

我的运行环境:
  操作系统:Windows 10
  JAVA版本:15.0.1
  Maven版本:3.8.1


0

我在将 Visual Studio Code 的 "Java Language Support" 插件从版本 0.66.0 升级到 0.67.0 后遇到了此问题。

降级回去后,我可以无错误地运行相同的代码。


0

检查.jar或.class文件的权限。我将该jar文件放置于项目库中,并授予-rw-r--r--的权限,现在我使用Linux将其更改为-rw-rw-r--

chmod 664 <.jar>

一个库在调用 ClassLoader.loadClass 时,由于权限不正确而导致加载 jar 中的类时出现错误。

0
在我的情况下,我使用的是Spring Tool Suite 4,我的问题通过以下两个步骤解决:
  1. 右键单击项目 --> 运行为 --> Maven clean。
  2. 右键单击项目 --> 运行为 --> Maven install。
然后我可以通过以下方式运行项目: 运行为 --> Spring Boot App。
希望能对某些人有所帮助 :)

-2

我删除了一些未使用的导入,这为我解决了问题。如果你从一开始就没有寻找它,那么你是找不到一个类的。


删除未使用的导入不会修复 ClassNotFoundException。未使用的导入在运行时没有任何影响。你肯定还做了其他事情...而且那个才是解决问题的关键。 - Stephen C
@StephenC 我知道我看到的。未使用的导入可能在运行时没有影响,但编译时呢? - Funny Geeks
那它们并不是未使用的。它们被用在了错误的方式上!例如,如果你导入一个与其他默认导入的类同名的类(例如当前包中或java.lang中的类),那么删除该导入会改变程序,并可能修复编译时甚至运行时问题。但这并不是ClassNotFoundException...这就是这个问题所涉及的内容。 - Stephen C
如果你知道你看到了什么...就复现它,并向我们展示证据。 - Stephen C
实际上...我猜如果你有导入隐藏了正确的类,并且你的编译和运行时类路径不同,它可能会修复ClassNotFoundException。但是你必须犯许多不同的错误才能做到这一点。 - Stephen C

-2

抱歉回答晚了,但我会用最简单的语言解释给你听。

当你输入“javac <programname.java>”时,编译器会检查程序并查找错误。首先确保你的程序与你在命令提示符中执行的目录相同。然后它会创建一个你的程序的.class文件。例如,如果我的程序名为Test.java,则创建的类文件应该是Test.class,这将在下一行中执行。

有时Java会为你的.class文件取其他名称,请使用该名称,你就可以得到输出结果了。


-11
将所有代码放在try块中,然后在catch块中捕获异常。
try
{
    // code
}
catch(ClassNotFoundException e1)
{
    e1.getmessage();
}

6
这并没有解决异常,而是隐藏了异常。另外,“e1.getmessage()” a) 大小写错误应该是getMessage(), b) 它不会起太大作用,因为它返回一个包含消息的字符串,但你没有将其打印或记录下来! - IBBoard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接