【发布时间】:2010-03-14 03:00:41
【问题描述】:
我想知道为什么 java 中的 main 方法只有 void 返回类型。
public static void main(String [] args)
为什么main方法除了void之外没有其他返回类型。
谢谢
【问题讨论】:
标签: java
我想知道为什么 java 中的 main 方法只有 void 返回类型。
public static void main(String [] args)
为什么main方法除了void之外没有其他返回类型。
谢谢
【问题讨论】:
标签: java
简短的回答是:因为language specification 就是这么说的。
在当今常用的操作系统(Windows 和 Unix 系列)中,来自进程的唯一“返回值”是 exit status,它是一个很小的数字(通常为 8 位)。可以使用System.exit(int) 方法从 Java 程序返回此值:
public static void exit(int status)终止当前运行的 Java 虚拟机。该参数用作状态码;按照惯例,非零状态码表示异常终止。
【讨论】:
您期望返回什么?
在 C 中,您通常会返回一个 int 退出代码。但是,在多线程系统中,这没有多大意义。通常,Java 程序将启动多个线程。主线程通常或多或少会立即返回。
System.exit 可用于以特定的退出代码退出。
【讨论】:
这似乎是一个武断的决定,可能考虑到并非所有操作系统都是统一的,因为它们允许程序返回退出代码。
Java 可以像 C 一样使用来自 main 的返回码 int 来指定。多线程无关紧要,因为只有一个线程最初启动 main 并且其返回值可能是 JVM 返回给操作系统的那个,而不管其他线程何时返回以及它们做什么。
这有点牵强,但如果有人构建了一个 JVM,它可以运行多个 Java 程序,每个程序都有自己的 main,它可以设计为返回最后一个要调用的 main 返回的值。
最合理的理由是 JVM 本身可能出于自身原因需要返回退出代码,但是,这个理由被 System.exit(int) 的规定所掩盖,它完全覆盖了 JVM 的返回代码。鉴于此,没有理由同样允许main 也返回int,就好像main 所做的最后一件事是System.exit(n)
总而言之,听起来像是一个随意的决定。
【讨论】:
首先,因为没有什么可以返回值。主流操作系统(例如 Windows、UNIX、Linux 等)不允许命令“返回”值。 (虽然可以说,退出代码是一个返回值,但它被限制为一个整数,并且有各种特定于操作系统的警告;例如,有多少位可以来自应用程序。)
其次,因为 Java 不允许您重载仅在返回类型上有所不同的方法。
第三,正如@Tom 所指出的,如果exit code 是main 的返回值,则很难处理调用System.exit(rc) 的其他线程。
【讨论】:
Java 指定应用程序入口点必须是public static,命名为main,返回void,并将String[] 作为参数。就是这样。
也就是说,您可以在技术上定义一个不符合这些标准的main 方法,但它们不会是有效的应用程序入口点。
public class MainMain {
public static void main(String args[]) { // application entry point
System.out.println(main());
}
private static String main() { // just a method named main
return "Hello world!";
}
}
您可能应该只为有效的 Java 应用程序入口点保留 main,但没有什么可以阻止您编写上述代码。
【讨论】:
因为您从 JVM Hello.main 运行 main,我们无法将值返回给 JVM。它只是给出运行时异常。
【讨论】:
对我来说,一个合理的中间方式(在具有 void 签名,但也需要向操作系统返回值之间)似乎是:在 main 中为与错误对应的所有返回值抛出运行时异常,使用该异常中的适当消息。
当然,这仅有助于在操作系统级别(例如,shell 脚本等)区分错误退出和非错误退出,但在许多情况下,这实际上就是所需要的,并且可能是最常见的用途这些环境返回值;如果此命令失败,则运行或不运行下一个命令。
【讨论】: