【问题标题】:return type of main in javajava中main的返回类型
【发布时间】:2010-03-14 03:00:41
【问题描述】:

我想知道为什么 java 中的 main 方法只有 void 返回类型。

public static void main(String [] args)

为什么main方法除了void之外没有其他返回类型。

谢谢

【问题讨论】:

标签: java


【解决方案1】:

简短的回答是:因为language specification 就是这么说的。

在当今常用的操作系统(Windows 和 Unix 系列)中,来自进程的唯一“返回值”是 exit status,它是一个很小的数字(通常为 8 位)。可以使用System.exit(int) 方法从 Java 程序返回此值:

public static void exit(int status)

终止当前运行的 Java 虚拟机。该参数用作状态码;按照惯例,非零状态码表示异常终止。

【讨论】:

    【解决方案2】:

    您期望返回什么?

    在 C 中,您通常会返回一个 int 退出代码。但是,在多线程系统中,这没有多大意义。通常,Java 程序将启动多个线程。主线程通常或多或少会立即返回。

    System.exit 可用于以特定的退出代码退出。

    【讨论】:

    • +1 用于解释当 main 完成时,程序本身可能不会
    【解决方案3】:

    这似乎是一个武断的决定,可能考虑到并非所有操作系统都是统一的,因为它们允许程序返回退出代码。

    Java 可以像 C 一样使用来自 main 的返回码 int 来指定。多线程无关紧要,因为只有一个线程最初启动 main 并且其返回值可能是 JVM 返回给操作系统的那个,而不管其他线程何时返回以及它们做什么。

    这有点牵强,但如果有人构建了一个 JVM,它可以运行多个 Java 程序,每个程序都有自己的 main,它可以设计为返回最后一个要调用的 main 返回的值。

    最合理的理由是 JVM 本身可能出于自身原因需要返回退出代码,但是,这个理由被 System.exit(int) 的规定所掩盖,它完全覆盖了 JVM 的返回代码。鉴于此,没有理由同样允许main 也返回int,就好像main 所做的最后一件事是System.exit(n)

    总而言之,听起来像是一个随意的决定。

    【讨论】:

      【解决方案4】:

      首先,因为没有什么可以返回值。主流操作系统(例如 Windows、UNIX、Linux 等)不允许命令“返回”值。 (虽然可以说,退出代码是一个返回值,但它被限制为一个整数,并且有各种特定于操作系统的警告;例如,有多少位可以来自应用程序。)

      其次,因为 Java 不允许您重载仅在返回类型上有所不同的方法。

      第三,正如@Tom 所指出的,如果exit codemain 的返回值,则很难处理调用System.exit(rc) 的其他线程。

      【讨论】:

        【解决方案5】:

        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,但没有什么可以阻止您编写上述代码。

        【讨论】:

          【解决方案6】:

          因为您从 JVM Hello.main 运行 main,我们无法将值返回给 JVM。它只是给出运行时异常。

          【讨论】:

            【解决方案7】:

            对我来说,一个合理的中间方式(在具有 void 签名,但也需要向操作系统返回值之间)似乎是:在 main 中为与错误对应的所有返回值抛出运行时异常,使用该异常中的适当消息。

            当然,这仅有助于在操作系统级别(例如,shell 脚本等)区分错误退出和非错误退出,但在许多情况下,这实际上就是所需要的,并且可能是最常见的用途这些环境返回值;如果此命令失败,则运行或不运行下一个命令。

            【讨论】:

              猜你喜欢
              • 2013-07-16
              • 2011-04-08
              • 1970-01-01
              • 1970-01-01
              • 2016-03-06
              • 2013-01-05
              • 1970-01-01
              • 2019-08-22
              • 1970-01-01
              相关资源
              最近更新 更多