当前位置: 首页 > 知识库问答 >
问题:

Java找不到主类

马宜民
2023-03-14

我编写了以下Java源文件(hello.Java):

package com;

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello!");
    }
}

我将其保存到c://tmpjava/hello.java

    null
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运行良好?

共有1个答案

古刚洁
2023-03-14

您的类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源文件(): 我将此保存到。 从命令行,我导航到该目录并运行。然后我运行: 然后,从我刚运行过的同一目录运行并获取: 这里发生了什么?!?如何运行正常,但不能运行? 问题答案: 您的课程属于该包。因此,您的课程的全限定名是。在命令行上使用java调用程序时,应提供包含方法的类的标准类名,并省略 .class ,如下所示: Java程序需要此完全限定的类名来了解您

  • 现在,在你报告这是一个已经被问过的问题之前,听我说完。 我已经看了所有其他问题,没有一个提供答案--我已经试过了所有的问题。此外,它们都至少有一年了,所以我猜答案不再起作用的原因是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