Java错误:Exception in thread "main" java.lang.NoClassDefFoundError

5

我是Java的初学者,正在学习普林斯顿大学提供的《算法》课程。在课程中,教授要求我们将algs4.jar下载到一个文件夹中并将其添加到类路径[1]。

我按照步骤进行操作,并尝试编写类似于HelloWorld的程序。

import edu.princeton.cs.algs4.StdOut;

public class HelloWorld {
     public static void main(String args[]) {
     StdOut.print("Hello World!");
}
} 

然而,当我编译文件时,控制台提醒我说:
NPP_EXEC: "java_Compile_Run"
NPP_SAVE: G:\java\helloworld\HelloWorld.java
javac -encoding UTF-8 "G:\java\helloworld\HelloWorld.java"
Process started >>>
<<< Process finished. (Exit code 0)

==========编译成功后开始运行==========
java -cp "G:\java\helloworld" "HelloWorld"
Process started >>>
Exception in thread "main" java.lang.NoClassDefFoundError:
edu/princeton/cs/algs4/StdOut
at HelloWorld.main(HelloWorld.java:5)
Caused by: java.lang.ClassNotFoundException: edu.princeton.cs.algs4.StdOut
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
<<< Process finished. (Exit code 1)
================ READY ================ 

我已经检查了我的类路径和编程文件。这个错误是什么意思?我该如何修复它?
任何建议都很有帮助。谢谢。
[1] http://algs4.cs.princeton.edu/code/
6个回答

7
如果您引用的是应该在类路径上的jar文件,则必须显式命名它。例如:
java -cp "G:/java/helloworld;G:/whereever/algs4j.jar" HelloWorld

他们是否真的System.out提供了另一个名称?在这种情况下,您也可以安全地忽略该jar文件,使用System.out而不是StdOut


我该如何在cmd中编写此语句?谢谢。 - gaoxinge
好的,就像我在那个答案中写的一样。你的问题包含 java -cp "G:\java\helloworld" "HelloWorld" - 无论你如何到达那里,你都需要添加应该在类路径上的 jar 文件以及目录。除了 javac 之外,你没有提到任何开发工具或其他使用的东西 - 如果你的问题是不知道如何配置你的 IDE,你应该说明你正在使用哪个 IDE。 - Olaf Kock
好的,猜猜$(CURRENT_DIRECTORY)会被替换成什么,并尝试看看需要将额外的jar放在哪里。提示:java -cp "$(CURRENT_DIRECTORY);G:/whereever/algs4j.jar" "$(NAME_PART)"很接近了,我会把放置jar的位置留给你去完成。 - Olaf Kock

7
根据本课程的说明,如果您导入了他们的库,应该使用javac-algs4进行编译和java-algs4进行执行。
如果您想知道这两个命令和原始命令javacjava之间的区别,您可以:
  1. 使用type命令查找此命令的位置
  2. 使用catvim查看此命令的内容
您可以看到,java-algs4-cp参数添加到原始的java命令中,就像Olaf Kock所说的那样。

5

您可能需要使用-cp标志设置类路径以包含包。

在使用-cp标志时,不要忘记使用.包括当前工作目录。

因此,类似javac -cp thejar.jar:.应该适用于Linux,或者javac -cp thejar.jar;.应该适用于Windows。


4

对于使用M1芯片的Mac电脑,进入您的文件夹,请使用cd命令:

javac -classpath ".:./algs4.jar" HelloWorld.java

java -classpath ".:./algs4.jar" HelloWorld

似乎Java 16现在使用冒号而不是分号。或者可能是因为我用的是Mac。无论如何,对我有效的是使用由冒号分隔的类路径。 - Folusho Oladipo

3

我刚刚在javacjava命令中都添加了classpath参数,像这样:

javac -classpath ".;drive\path\to\algs4.jar" Hello.java

并且

java -classpath ".;drive\path\to\algs4.jar" Hello

此外,如果您手动添加了CLASSPATH环境变量,请记得关闭并重新启动cmd控制台。

1
你在Java代码中导入了StdOut类(import edu.princeton.cs.algs4.StdOut;),你需要告诉Java如何实现stdOut。
根据你提供的链接(http://algs4.cs.princeton.edu/code/),你需要按照"安装教材库"部分先安装此库。

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