我编写了以下Java源文件(hello.Java
):
package com;
public class Hello {
public static void main(String[] args) {
System.out.println("Hello!");
}
}
我将其保存到c://tmpjava/hello.java
。
Exception in thread "main" java.lang.NoClassDefFoundError: Hello/class
Caused by: java.lang.ClassNotFoundException: Hello.class
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: Hello.class. Program will exit.
这是怎么回事?!?如何才能使javac
运行良好,而不能使java
运行良好?
您的类hello
属于包com
。因此,类的完全限定名是com.hello
。在命令行中使用java调用程序时,应该提供包含main
方法的类的完全限定类名,并省略。class,如下所示:
java com.Hello
java程序需要这个完全限定的类名来理解您引用的是哪个类。
但你还有一个问题。java程序使用文件系统定位包、子包和属于它们的类。因此,如果您有类似com.hello
的包结构,java程序希望在名为com的目录中找到一个名为hello.class的类文件,如下所示:com/hello.class。实际上,您可以在您看到的异常
中观察到这种行为;您错误地使用了hello.class,java将其解释为一个名为hello
的包和一个名为class
的类,并且正在查找目录结构hello/class:
noClassDefFoundError:hello/class
但是编译器javac在默认情况下不设置这个目录结构。参见javac的文档,但重要的一点是:在编译时,可以使用-d
标志指定目标目录:
-d目录
javac -d . Hello.java
如果您像这样调用编译器,它将为您创建com目录,并按照java程序期望的方式将编译后的类文件放入其中。然后,当您像上面那样从C:\tmpjava运行java时,您的程序应该执行。
您可以使用映射包结构的目录结构来设置源代码:将源文件hello.java放入一个名为com的目录中,在您的示例中为c:\tmpjava\com\hello.java。现在,您可以在C:\tmpjava中运行javac编译程序,如下所示:
javac com\Hello.java
您没有提供-d
标志,但这很好,因为您已经自己创建了目录结构,并再次引用了上面的文档:
如果没有指定-d,javac将类文件放在与源文件相同的目录中。
同样,当您像上面那样运行java时,您的程序应该执行。
请注意,第二种选择是java程序员通常使用的选择:源代码文件组织在一个目录结构中,该目录结构反映了包结构。
请注意,当您使用Eclipse之类的IDE运行java代码时,这主要是为您处理的,但您仍然会遇到类路径问题。
我编写了以下Java源文件(): 我将其保存到。 null 这是怎么回事?!?如何才能使运行良好,而不能使运行良好?
现在,在你报告这是一个已经被问过的问题之前,听我说完。 我已经看了所有其他问题,没有一个提供答案--我已经试过了所有的问题。此外,它们都至少有一年了,所以我猜答案不再起作用的原因是Netbeans一定已经更新了。 -CoolKat
我遇到了一个问题,找不到主类错误与一个有点复杂的程序,我正在工作。为了消除可能的问题,我决定尝试一个hello world程序,看看我是否能让它发挥作用。我在一个服务器上工作,我很确定它运行的是Red Hat Enterprise6。为了回答这个问题,我遵循了Bart Kiers提供的以下步骤: null 如果我键入java-version,将显示版本信息,这表明我的PATH变量设置正确。有人对可
我还尝试将我的类路径设置为'C:\ProgramFiles\java\jre1.8.0_144\lib\rt.jar',尽管我读到这不是必需的。 从class01.java创建class01.class没有问题 不过,当我尝试运行程序时
我认为这个错误是由于路径或类路径不正确造成的,但是我在下载Eclipse Neon时使用Java几个月没有问题,因为我设置了路径。我还发现在包中也会导致错误,所以我在包外创建了类,但仍然得到了错误。 Windows7上的Path和ClassPath环境变量是: 路径变量名:C:\ProgramFiles\Java\JDK1.8.0_101\bin;C:\ProgramFiles\Java\JRE1
我在安装了OpenJDk 7的Ubuntu 12.04上使用Eclipse 3.7.2 java版本给出 每当我尝试运行项目时,都会收到以下错误。 所有项目都会发生这种情况,我已经在我的 Windows 系统上成功编译了这些项目。而且,当直接从终端使用 javac 和 java 时,它可以工作。有没有简单的解决方案?这是因为OpenJDK吗? 类代码是: 更新:我的源代码在一个名为swingtes