【问题标题】:Why does Java main() method accept an array of String args?为什么 Java main() 方法接受 String args 数组?
【发布时间】:2010-10-18 18:02:14
【问题描述】:

既然它可能是 Java 语言中使用最广泛的方法之一,为什么它必须接受一个字符串数组并且没有它就无法工作?例如,我总是可以接受:

public static void main() {}

结束

public static void main(String[] args) {}

除了能够接受命令行参数之外,这是否还有更高的目的,尤其是因为绝大多数 Java 程序都是 GUI 驱动的并且不需要通过命令行接收参数?

【问题讨论】:

  • 也许你会忽略任何参数,但是那些希望支持参数的人呢?通常来自命令行?命令行等通常通过 Steing 数组传递参数。如果你不关心他们 - 忽略他们。添加支持 fir main() 只会在包含和不包含艺术的 main 的情况下增加歧义。

标签: java programming-languages


【解决方案1】:

Java 应用程序可以从命令行接受任意数量的参数。这允许用户在启动应用程序时指定配置信息。例如,我们可以从命令行本身传递用户名、密码。

class Test {

    static void connectDB(String username, String password) {       
        System.out.print(String.format("Username: %s, Password: %s", username, password));
        // code to connect DB
    }

    public static void main(String args[]) {
        connectDB(args[0], args[1]);
    }
}  

现在使用javac Test.java 编译程序 并使用 java Test rootuser Test1234执行

输出将是:

Username: rootuser, Password: Test1234
  

所以,我们可以使用 commandline-argument 这种目的。

【讨论】:

    【解决方案2】:

    即使是 gui 驱动的 java 应用程序也会从一些 main 方法开始。 “更高的目的”从来都不是接受命令行参数。

    目的只是接受参数。时期。无论何时你启动任何程序,而不仅仅是 Java,你总是需要一些语法来传递参数

    【讨论】:

    • 这回答了我的部分问题,但这些论点是用来做什么的?
    • 他们被用来做他们设计要做的任何事情。它们可以是用于在某些 GUI 工具中显示的文件名,也可以是您想用来生成谜题的数字。
    • 这个设计选择是由命令行参数的约定引导的。与 C 程序的标准入口点的相似之处并非巧合。
    【解决方案3】:

    程序总是采用命令行参数。由程序员决定它们是否用于任何用途。

    因此,在没有字符串数组的情况下实现 main 会导致更复杂的启动逻辑和潜在的混乱和错误行为,因为不编写单个参数声明(在您的整个程序中!)而不仅仅是有争议的收益。

    鉴于 Java 的整体冗长性以及对 Eclipse 等 IDE 中样板代码通用模板的支持,我看不出真正的问题在哪里。

    【讨论】:

      【解决方案4】:

      我猜这是因为许多 Java 程序至少需要一些参数。与 C 一样(Java 的语法灵感,如果没有别的),Java 认为将这些作为参数提供给 main 的最佳方式。

      即使是 GUI 程序也经常会使用命令行参数。仅仅因为它启动的 shell 通常不要求这些参数(默认情况下),并不意味着它们不受支持。

      【讨论】:

        【解决方案5】:

        我同意它可以更灵活。例如,在 C# 中,所有这些都是可接受的入口点:

        static void Main()
        static void Main(string[] args)
        static int Main()
        static int Main(string[] args)
        

        返回int 的版本使用返回值作为进程的退出代码。如果您不关心接收任何参数,则可以使用不带任何参数的版本之一。程序启动时给出的任何参数都将被忽略。

        所以是的,它可以更灵活 - 但它从来没有让我觉得它是 Java 中的一个重大问题。

        【讨论】:

        • 当您提供所有 4 个主要方法时,将使用上述哪一个?
        • 如果你试图给出所有它可能会返回一个语法错误。
        • 好吧,你不能给出全部 4,因为你不能通过返回类型重载。但是,如果您提供两个,则会导致错误 CS0017。
        • @Peter:由于 Main 无论如何都是特殊的,因此该语言可以指定任何其他行为 - 例如当且仅当操作系统传递实际参数时才调用第二个版本。
        • 在 Java 中,您可以提供所有四个版本,尽管它确实需要扩展另一个类(Object 除外)。
        【解决方案6】:

        还有很多java程序通过命令行接收参数。想想javac、ant、maven等

        【讨论】:

          【解决方案7】:

          许多 GUI 程序都提供了接受命令行开关以控制它们在启动时的行为的工具。

          【讨论】:

          • 添加到您的声明中,许多 GUI 程序接受“文件名”作为参数。 (想一想拖入可执行文件的 MSWord 文档)。
          【解决方案8】:

          “这有没有更高的目的(..)”

          是的:遗留。

          【讨论】:

            【解决方案9】:

            “绝大多数”程序所做的事情对于需要做的事情并没有太大的影响。还是有很多命令行程序是由命令行参数驱动的。

            【讨论】:

            • 这只意味着您应该能够在需要时接收参数。如果您不需要它们,则不必强制接收它们。这是语言设计者的选择。
            • 您的说法是正确的。在这个特定的案例中,我与 Java 语言设计人员在一起(我是 C# 粉丝)。有一个未使用的参数并没有真正的害处,但它促进了语言的一致性。无论如何,这是一个很小的问题,绝对是 lang 设计者做出的选择;没什么好说的
            猜你喜欢
            • 2014-06-22
            • 2018-05-09
            • 2016-01-31
            • 2014-02-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多