运行java程序错误“线程中的异常”主“java.lang.NoClassDefFoundError:Driver”

时间:2013-05-04 02:58:13

标签: java compilation

我获得了一大堆未完成的代码,我的任务是完成它。但是,我的导师告诉我原来未完成的代码应该运行,但事实并非如此。我将它们编译成.class文件,但是当我输入“java DirectoryLister Driver GUI”时,我得到了

http://imgur.com/cuN9Ea8

我是Java的新手,我以前唯一的经验是C. 我已将三个文件GUI.java, directoryLister.java, and Driver.java

一起编译
javac GUI.java DirectoryLister.java Driver.java 

现在我在同一目录中有三个.class文件,但是当我这样做时

java DirectoryLister Driver GUI 

我收到上面的错误。救命啊!

2 个答案:

答案 0 :(得分:2)

当您运行java时,您必须提供一个类来运行,而不是三个。该类将执行其main方法。您必须从编译类的根目录运行java,并且必须使用完全限定的类名(即包括包)。

例如,如果您的源文件src中包含源文件./a/b/C.java,则该类将在src/a/b/C.class中编译。然后,您需要确保自己位于src并运行java a.b.C

答案 1 :(得分:1)

从这些错误来看,这似乎是一个包问题。

首先,您无法在多个文件上运行java,因为java会将后面的名称作为命令行参数传递。

其次,在DirectoryLister.java的顶部,您应该看到

package directoryLister.template;

这意味着java类的 完全限定名称 directoryLister.template.DirectoryLister。完全限定名称基本上是完整的类名,包括它所在的包。包是文件系统上同一目录中的类的分组。

java的设置方式,可以从任何工作目录编译java源文件。但是,在类文件上运行java非常严格:

  • 如果源文件位于包foo.bar中,则该类文件所在的目录必须被称为foo / bar /。
  • 必须从包层次结构的根目录运行
  • java。如果类文件位于myjavafiles / foo / bar /中,并且位于包foo.bar中,则在运行java时必须将myjavafiles作为当前工作目录。
  • Java必须传递类的完全限定名,因为如果两个类位于不同的包中,则它们可以具有相同的名称。这意味着您必须运行java directoryLister.template.DirectoryLister或包含主类的任何类。
  • 请注意上述语句中的句点,而不是斜杠。但是,javac需要斜线。
  • 请注意,java会找到其他类文件,只要它们位于正确的位置,您不必将它们作为参数传递给java
  • 另请注意,javac没有java这些严格的限制。

See here for more info on Fully Qualified names.