Java找不到主类

2024-01-12

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

package com;

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

我将其保存到C:/tmpjava/Hello.java.

从命令行,我导航到该目录并运行javac Hello.java。然后我跑dir:

  • Hello.class
  • Hello.java

然后,从我刚刚运行的同一目录中javac从,我跑java Hello.class并得到:

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, 像这样:com/Hello.class。事实上你可以在Exception你看到的;你错误地使用了同学们好,java将其解释为package named Hello, and a class named class,并且正在寻找目录结构同学们好:

java.lang.NoClassDefFoundError:你好/类

但是编译器javacdoesn't默认设置此目录结构。请参阅javac 的文档 http://docs.oracle.com/javase/1.4.2/docs/tooldocs/windows/javac.html,但重要的是:当您进行编译时,您可以使用指定目标目录-d flag:

-d 目录

设置类文件的目标目录。目标目录必须已经存在; javac 将不会创建目标目录。如果类是包的一部分,javac 会将类文件放入反映包名称的子目录中,并根据需要创建目录。例如,如果指定 -d c:\myclasses 并且类名为 com.mypackage.MyClass,则类文件名为 c:\myclasses\com\mypackage\MyClass.class。

如果未指定 -d,javac 将类文件放在与源文件相同的目录中。

最后一点粗体字是让初学者感到困惑的根源,也是你自己问题的一部分。

所以你有两种选择:

  1. 在您的情况下,如果您提供当前目录作为目标目录就可以了,就像这样(句点. means 当前目录):

    javac -d . Hello.java
    

    如果您像这样调用编译器,它将创建com目录,并将编译后的类文件放入其中,就像 java 程序期望找到它的方式一样。然后当你像上面那样运行java时,从c:\tmpJava,你的程序应该执行。

  2. 您可以使用反映包结构的目录结构来设置源代码:放置源文件你好.java在一个名为的目录中com,在你的情况下:c:\tmpJava\com\Hello.java。现在,从c:\tmpJava你可以像这样运行 javac 编译:

    javac com\Hello.java
    

    您还没有提供-d标志,但这很好,因为您自己创建了目录结构,并再次引用上面的文档:

    如果未指定 -d,javac 将类文件放在与源文件相同的目录中。

    同样,当您按上述方式运行 java 时,您的程序应该执行。

    请注意,第二种选择是 java 程序员常用的一种选择:源代码文件以镜像包结构的目录结构进行组织。

在这个解释中我们忽略了类路径。您还需要了解编写 java 程序,但在您只是在当前目录中编译程序的情况下 - 如果您在编译类时遵循上述两种选择之一 - 您可以无需设置类路径,因为,默认情况下,java程序将当前目录作为类路径。另一段引言,来自java 的文档 http://docs.oracle.com/javase/1.4.2/docs/tooldocs/windows/java.html:

-cp 类路径

指定目录、JAR 存档和 ZIP 存档的列表以搜索类文件。类路径条目由分号 (;) 分隔。指定 -classpath 或 -cp 会覆盖 CLASSPATH 环境变量的任何设置。

如果未使用 -classpath 和 -cp 且未设置 CLASSPATH,则用户类路径由当前目录 (.) 组成。

请注意,当您使用像 Eclipse 这样的 IDE 来运行 java 代码时,这大部分已经为您处理,但您仍然会遇到类路径问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java找不到主类 的相关文章

随机推荐

  • 无法实例化 Image java 类型?

    public Image images new Image 20 for i 0 i lt 10 i images i new Image getClass getResource images i jpg 我正在尝试将图像添加到数组 但出
  • jQuery .find("body").html() == null

    我有一个名为 test html 的 html 页面 这是它的内容
  • 不要通过 CTRL+C 向子进程发送 SIGINT,但也不要忽略信号本身

    我正在尝试编写一个任务控制程序 非常类似于Supervisor 我从配置文件运行一些程序并让它们在后台运行 而在主进程中我读取并执行其他命令 Before fork ing 在主流程中我调用 sigaction SIGINT the han
  • 对 Git 的错误提交

    好吧 大约 700 次提交前 gt 30 天 我无意中将 ThirdParty mapper Songbird 1 2 0 1146 windows i686 msvc8 exe iTunes 下载类型 保存在我的本地 Git 存储库中 而
  • 我可以在没有管理员身份的情况下运行 RegAsm 吗?

    我的同事正在尝试通过 RegAsm exe 注册一些 COM 组件 我编写的 它说他需要管理员权限 他的帐户具有管理员权限 但他没有以管理员身份登录 有没有办法使用他的常规用户帐户并成功完成此任务 我在一个环境 司法管辖区工作 根本不可能向
  • 代码点火器 count_all_results

    我正在使用最新的codeIgniter已发布 我也在与jquery datatables from datatables net 我写了这个函数 https gist github com 4478424 https gist github
  • 路径存在的 MVC 路由

    我正在尝试创建一条路线 为网址添加标题 例如 http mysite com tech 但我的站点下还有一个实际目录 tech 其中包含其他静态资源 不是我的设计选择 但我正在将旧站点迁移到 mvc 并且不想破坏一堆非常旧的链接 我的路线似
  • t.replace 不是一个函数(…)trim

    当我签入 console log 并打破它时 以下内容在问题中产生错误 var map L map map setView 0 0 2 Now this should look something like Australia 2006 2
  • 用于匹配多语言号码的正则表达式不检测中文号码

    我有一个方法可以检测字符串是否是数字 public static boolean isNumber String num return num matches p N 上述方法可以成功匹配英文 印地文 阿拉伯数字 但无法匹配中文数字 三万零
  • javascript中将数组拼接成数组的更好方法

    有没有比这更好的方法在javascript中将一个数组拼接到另一个数组中 var string theArray splice start number newItemsArray join eval string 您可以使用apply h
  • Pandas:将日期划分为 30 分钟间隔并计算平均值

    我有一个带有两列的 Pandas 数据框 它们是speed and time speed date 54 72 1 33 56 49 37 1 33 59 37 03 1 34 03 24 02 7 39 58 28 02 7 40 01
  • python heapq 合并的内部工作。如何在不生成列表的情况下对列表进行排序

    如何heapq merge 即使不生成列表也可以对列表进行排序 不确定我说清楚了没有 所以 这是从leetcode 的超级丑数问题 https leetcode com problems super ugly number 和这个Pytho
  • 涉及动态字段的数据库结构

    我正在做一个项目 它主要是为了学习目的 我发现实际上尝试一个复杂的项目是掌握基础知识后学习语言的最佳方法 数据库设计不是强项 我开始阅读它 但它还处于早期阶段 我仍在学习 这是我的 alpha 模式 我真的只是想记下我能想到的所有内容 看看
  • 通过 IMAP 添加自定义 RFC822 标头?

    有没有一种简单的方法可以使用 imaplib 将自定义 RFC822 标头添加到 IMAP 服务器上的邮件中 我正在编写一个基于 python 的程序来过滤我的 IMAP 邮件存储 当我使用 Procmail 执行此操作时 我可以选择添加标
  • 如何在 ASP.NET MVC 身份上设置自定义身份验证?

    我需要的 我有一个 ASP NET 身份系统设置并使用外部登录运行 无论出于何种原因 我需要在 ASP NET 身份验证之后设置自定义身份验证 让我解释一下如何 假设我有三个页面供用户在我的应用程序上查看 页面 A B C 谁可以查看页面
  • docker-compose - ADD 失败:构建上下文之外的禁止路径

    我有这样的文件夹结构 project config docker Dockerfile docker compose yml src here is code requirements txt Dockerfile FROM python
  • React:TypeError:尝试使用react-bootstrap容器时无法读取null的属性(读取'useContext')

    正如标题中所述 我正在尝试创建一个布局组件 但使用任何react bootstrap组件似乎都会给我错误 在这种情况下 使用我收到错误 类型错误 无法读取 null 的属性 读取 useContext 该布局组件的代码如下 import R
  • awk中的浮点计算

    我对以下行为感到惊讶awk表演时浮点计算 这导致我对表数据的计算错误 awk BEGIN print 2 3 0 1 23 lt Ok awk BEGIN print int 2 3 0 1 22 lt Wrong awk BEGIN pr
  • 使用 NSLocalizedString 的最佳实践

    我 像所有其他人一样 使用NSLocalizedString本地化我的应用程序 不幸的是 有几个 缺点 不一定是 NSLocalizedString 本身的错误 包括 Xcode 中的字符串没有自动补全功能 这使得工作不仅容易出错 而且令人
  • Java找不到主类

    我编写了以下 Java 源文件 Hello java package com public class Hello public static void main String args System out println Hello 我