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找不到主类 的相关文章

  • 为什么 Hashtable 不允许空键或空值?

    正如 JDK 文档中所指定的 Hashtable 不允许空键或空值 HashMap 允许一个空键和任意数量的空值 为什么是这样 Hashtable 是较旧的类 通常不鼓励使用它 也许他们看到了对 null 键的需要 更重要的是 null 值
  • Java - 将无符号十六进制字符串解析为有符号长整型

    我有一堆十六进制字符串 其中之一是 d1bc4f7154ac9edb 这是 3333702275990511909 的十六进制值 如果执行 Long toHexString d1bc4f7154ac9edb 这与您得到的十六进制相同 现在
  • 使用 TLS PSK 加密时如何正确检测流结束?

    我已经准备好了一个简单的 TLS PSK 客户端测试用例 https github com afarber jetty newbie tree master TlsPskClient2 src main java de afarber tl
  • 来自行号的方法名称

    给定特定类源代码 Java C 的行号 是否有一种简单的方法来获取它所属的方法的名称 如果它落入其中 大概使用抽象语法树 这对于将 checkstyle 的输出限制为仅触及的方法很有用 我假设您必须使用抽象语法树来执行 Line gt Me
  • java 拖放

    我尝试熟悉java中的拖放 但我发现的所有教程都是 让我生气 我想要的只是从 JList 包含在名为 UserPanel 的自制 JPanel 中 拖动 PublicUserLabel 并将其放入从 JTabbedPanel 继承的自制类中
  • Java 错误和警告列表

    在哪里 如何获得所有 java 和 javac 的错误和警告消息的列表 This http mindprod com jgloss compileerrormessages html我认为页面是您所需要的
  • Jenkins 未显示 Maven 编译器错误

    在 Jenkins 中构建多模块 maven 3 项目时 如果出现构建错误 我们会收到一条神秘消息 表明 Maven 编译器插件失败 这在上周才刚刚开始发生 INFO BUILD FAILURE INFO INFO Total time 1
  • 传递自定义类型查询参数

    如何接受自定义类型查询参数 public String detail QueryParam request final MYRequest request 上面的行在启动服务器时出现错误 jersey server model ModelV
  • 使用 https 的 Web 服务身份验证给出错误

    我编写了一个简单的 Web 服务 并使用摘要和 HTTPS 身份验证来保护它 我已经使用 Java 中的 keytool 生成了我的证书 当我通过创建 war 文件在 Tomcat 中部署 Web 服务时 axis 的欢迎页面正确显示 但是
  • 是否可以使用 Apache Tika 提取表信息?

    我正在寻找 pdf 和 MS Office 文档格式的解析器 以从文件中提取表格信息 当我看到 Apache Tika 时 正在考虑编写单独的实现 我能够从任何这些文件格式中提取全文 但我的要求是提取表格数据 我希望有 2 列采用键值格式
  • javadoc 子集/java 库组织

    我自己从来没有运行过javadoc 无论是在命令行还是ant 的 javadoc 任务 http ant apache org manual Tasks javadoc html 我将使用 ant 我需要为我编写的库生成 javadoc 问
  • 在 Eclipse RCP 应用程序中禁用插件贡献

    我经常遇到这个问题 但尚未找到解决方案 每当我编写一个新的基于 Eclipse RCP 的应用程序并包含来自 Eclipse 平台的插件时 我都会 继承 其中一些插件的 UI 贡献 大多数贡献 菜单项 键盘快捷键 属性页 都很有用 但有时我
  • 如何在 JASPIC 中保存经过身份验证的用户?

    我开发了一个安全认证模块 SAM 并实现了validateRequest方法 我还有一个简单的 Web 应用程序配置为使用此 SAM In my validateRequest方法 我检查 clientSubject 并设置一个Caller
  • Java 8:如何创建毫秒、微秒或纳秒的 DateTimeFormatter?

    我需要创建格式化程序来解析具有可选的毫秒 微米或纳秒分数的时间戳 例如 对于我的需求 我看到以下机会 DateTimeFormatter formatter new DateTimeFormatterBuilder append DateT
  • 向Java类库添加函数

    我使用的 Java 类库在很多方面都不完整 有很多类我认为应该内置其他成员函数 但是 我不确定添加这些成员函数的最佳实践 让我们调用不足的基类A class A public A long arbitrary arguments publi
  • 如何更改 JAX-WS Web 服务的地址位置

    我们目前已经公开了具有以下 URL 的 JAX RPC Web 服务 http xx xx xx xx myservice MYGatewaySoapHttpPort wsdl http xx xx xx xx myservice MYGa
  • ebean 映射到 BYTEA 的数据类型是什么?

    我有一个游戏 2 0 2 需要在数据库中存储一些文件的应用程序 我们使用 Ebean 作为 ORM 我相信我的数据库中需要一个 BYTEA 列来存储该文件 但我不确定在我的模型中使用什么数据类型 我应该使用某种Blob 或者只是一个byte
  • 用于生成 ISO 文件的 Maven 插件

    有没有可以生成ISO镜像的maven插件 我需要获取一些模块的输出 主要是包含 jar 的 zip 文件 并将它们组合成一个 ISO 映像 Thanks 现在有一个 ISO9660 maven 插件可以完成这项工作 https github
  • junit4 使用特定测试方法创建测试套件

    在 junit4 中 我想执行来自不同类的特定测试方法 即想要使用来自不同类的特定测试方法创建一个测试套件 假设我有两门课 public class Test Login Test public void test Login 001 Sy
  • 亚马逊 Linux - 安装 openjdk-debuginfo?

    我试图使用jstack在 ec2 实例上amazon linux 所以我安装了openjdk devel包裹 sudo yum install java 1 7 0 openjdk devel x86 64 但是 jstack 引发了异常j

随机推荐

  • 无法实例化 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 我