0

从命令行运行基本的 java 程序是一个 3 个步骤的过程:

  1. 编写代码:

    公共类 HelloWorld { public static void main(String[] args) { System.out.println("Hello, World"); } }

  2. 编译javac HellWorld.java将检查错误并生成HelloWorld.class文件。

  3. 通过给出类名来运行代码 -->java HelloWorld

现在,我很想知道为什么:

java HelloWorld有效,但是当我们给出类文件的完整路径时,它会引发错误

$ java HelloWorld.class 
Error: Could not find or load main class HelloWorld.class

如果我们只给出类名与带有文件扩展名的类名有什么区别?

4

3 回答 3

6

如果我们只给出类名与带有文件扩展名的类名有什么区别?

您提供给java二进制文件的参数并不意味着是文件名。它应该是一个类名。因此,特别是,如果您尝试启动一个Baz在包中调用的类,foo.bar您将运行:

java foo.bar.Baz

同样,如果您尝试运行java HelloWorld.class它,就好像您正在尝试运行一个class在 package中调用的类HelloWorld,这是不正确的。

基本上,您不应该将参数视为文件名 - 您应该将其视为完全限定的类名。哎呀,文件系统上甚至可能没有一个简单Baz.class的文件——它可能隐藏在一个 jar 文件中。

于 2012-08-12T07:47:43.303 回答
2

如果我们只给出类名与带有文件扩展名的类名有什么区别?

这是因为它就是这样。从 Java 1.0 开始, Sun / Oracle 就已经实现了java以这种方式工作的命令,更改它会造成巨大的破坏。

正如 Jon 所说,命令的参数是完全限定的类名,而不是文件名。事实上,同名的文件很可能HelloWorld.class不存在。它可能是 JAR 文件的成员……或者在某些情况下,几乎是任何东西。


在 Java 11 及更高版本中,还可以使用单个命令编译和运行单个 Java 源文件,如下所示:

java HelloWorld.java

(这可能是因为 Oracle 不再支持没有 Java 字节码编译器的 Java 发行版。)

于 2012-08-12T07:55:52.390 回答
-1

在 Java 编程语言中,源文件(.java 文件)被编译成(虚拟)机器可读的类文件,其扩展名为 .class。

编译后运行 java 类文件时,运行以下命令:

java HelloWorld

注意:需要设置java类路径

于 2012-08-12T07:50:25.093 回答