【问题标题】:Why is String[] args required in Java?为什么 Java 中需要 String[] 参数?
【发布时间】:2010-12-12 22:13:51
【问题描述】:

我知道 String[] args 是作为参数传递给 main 的字符串数组。

java Print "Hello, World!"

 

class Print {
  public static void main(String[] args) {
    System.out.println(args[0]);
  }
}

但是,当您不将其作为参数包含时(即使您不使用),它也会引发异常。那么为什么需要它呢?另外,为什么不能是 int[] 或 boolean[]?

【问题讨论】:

    标签: java


    【解决方案1】:

    它是一个字符串,因为命令行是用文本表示的。如果您想将该文本转换为整数或布尔值,您必须自己进行 - 操作系统或 Java 引导程序如何准确地知道您希望如何解析所有内容?我想Java 可以寻找一个与命令行参数具有相同数量参数的主方法,然后尝试使用Integer.parseInt 等来解析它们......但这会非常复杂,并且会在许多情况下仍然不足。

    至于它是强制性的——基本上,Java 设计者决定坚持单一的方法签名,坦率地说,这比允许它是可选的要简单。不过有可能 - 在 C# 中,您可以拥有任何

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

    说实话,最终并没有太大的区别。必须包含该参数没有明显的缺点。

    【讨论】:

    • +1 - 没有任何区别。继续前进,这里什么都没发生:-)
    • @paxdiablo:因为我在 DevDays 上的演讲有点有趣,仅此而已。几天或一周后会恢复。
    • 感谢乔恩的回答!顺便说一句,你的最新文章非常非常好。
    • 我只是想知道:到底谁有 111k 的声誉,但不是 Jon?哦,乔恩。那是谁。 :)
    • 为什么会有这样的签名?如果不写,它会给出一个例外!
    【解决方案2】:

    Java 运行时系统专门寻找具有单个 String[] 类型参数的方法,因为它希望将参数传递给您的 main 方法。如果这样的方法不存在,它会通过异常通知您。

    如果您想将(字符串)命令行参数视为整数或布尔值,您需要自己进行转换。这使您可以处理有人输入 "ponies" 的情况,您希望得到一个整数。

    【讨论】:

    【解决方案3】:

    这就是语言的设计方式。 C 和 C++ 都以类似的方式执行此操作,但有一个单独的计数,包含在 Java 的字符串数组中的信息。

    本可以将其设计为采用整数或布尔值,但这会为 Java 运行时增加更多工作而可能带来的好处很少。

    字符串可用于将任何类型的信息传输到主程序(包括整数和布尔值)。如果你想传入一个字符串,整数就不是这样了(用户必须手动将其编码为 UTF-8 或其他东西,而不是让人们喜欢该语言的东西)。

    只记得声明它。无论如何,如果您愿意,请提出更改语言的请求(使其成为可选的,或允许其他签名),但我怀疑这不会走得太远。

    【讨论】:

      【解决方案4】:

      这是一个约定。该方法由命令行解释器使用,这就是它所期望的。此外 - 编译器也需要这种特定形式的签名,如果您省略参数,则不会编译,例如

      【讨论】:

      【解决方案5】:

      string[] 参数用于保存命令行参数,第一个是类名。此外,如果你在没有 string[] 的情况下调用你的 main 方法,它将只是一个重载,JVM 不会调用该方法。如果你跳过这个签名 main 方法,JVM 将抛出异常

      【讨论】:

      • 第一个命令行参数不是Java中的类名。如果我们不传递任何命令行参数,即只说 java yourClassName,则不会将 className 放入 String 数组中。在 C/C++ 中,可执行文件名是第一个参数。
      【解决方案6】:

      因为运行main() 函数的代码非常专门针对该签名。把它想象成在某个地方:

      YourClass.main(new String[] { ... });
      

      显然,如果 main 需要其他任何东西,这将失败。

      【讨论】:

        猜你喜欢
        • 2012-06-02
        • 1970-01-01
        • 2011-02-21
        • 1970-01-01
        • 1970-01-01
        • 2012-01-16
        • 1970-01-01
        • 2017-05-31
        • 1970-01-01
        相关资源
        最近更新 更多