1

我正在尝试从 Windows 的命令行运行一个非常简单的一类“Hello World”程序。

.java文件位于“C:\Users\UserName\Desktop\direcName”。包是deem,类名是test.

我可以 cd 到该目录并从那里使用它进行编译,javac test.java并且效果很好。但是,当我尝试使用以下命令运行它时:

java testjava -classpath directory testjava -cp . test 它抛出“线程中的异常main java.lang.NoClassDefFoundError: test (wrong name: deem/test)

如果我使用java deem.test,它会说:Error, could not find or load main class deem.main

如何修复异常并让我的程序运行?

谢谢

4

2 回答 2

5

这是从命令行运行 Java 程序时出现的“初学者常见错误”的变体。

java test 或 java -classpath 目录 test 或 java -cp 。测试它抛出“线程主java.lang.NoClassDefFoundError中的异常:测试(错误名称:deem/test)。

JVM 实际上是在告诉您在搜索路径上找到了“test.class”,但是当它读取类文件时,它得出的结论是该文件应该位于“./deem/test.class”或“directory/deem/” test.class" ...取决于您实际使用的“-cp”/“-classpath”参数

如果我使用 java deem.test 它说:错误,找不到或加载主类 deem.main

这现在告诉您它找不到“deem/main.class”。

请注意,您现在已经告诉它查找名为“deem.main”的类,而不是“test”或“deem.test”。(或者也许你只是在那里抄错了一些东西。)

规则非常简单:

  1. 您必须将完全限定的类名java作为选项后的第一个参数。(不是简单的类名。 不是“.class”文件名。不是入口点方法的名称。)
  2. 您必须指定类路径,以便java命令可以
    • 将类名映射到类文件的相对路径名(例如foo.bar.baz.MyClass映射到foo/bar/baz/MyClass.class)...
    • 然后根据类路径条目之一解析该相对路径;例如,如果.是类路径,则./foo/bar/baz/MyClass.class.
  3. 该类必须具有所需的public static void main(String[])入口点方法。

所以如果...

  1. 您的班级的完全限定班级名称是deem.test;即test类在包deem中,并且
  2. 对应的类文件在./deem/test.class, AND
  3. 它具有所需的入口点方法,并且
  4. 测试应用程序不依赖于您的其他类或 3rd 方库...

然后 java -cp . deem.test应该工作。

于 2012-10-08T01:54:07.903 回答
1

如果该类位于“deem”包中,那么您需要像这样包含包名。

java deem.test

那应该行得通。

于 2012-10-08T00:20:48.153 回答