在主方法中,“String args []”参数是什么?

390
以下Java代码的含义是什么?
public static void main(String[] args)
  • String[] args 是什么?

  • 何时会使用这些 args?

源代码和/或示例优于抽象的解释。

18个回答

388

在Java中,args包含作为String对象数组提供的命令行参数

换句话说,如果您在终端中运行程序:

C:/ java MyProgram one two

那么args将包含["one", "two"]

如果您想要输出args的内容,您只需像这样循环遍历它们...

public class ArgumentExample {
    public static void main(String[] args) {
        for(int i = 0; i < args.length; i++) {
            System.out.println(args[i]);
        }
    }
}
程序将在终端打印出:
C:/ java MyProgram one two
one
two
    
C:/

67
值得注意的是,args 不一定非要命名为 args (你可以将其命名为任何你想要的名称),但最好遵循惯例。有时你也可能会看到 String... args,这是等效的。 - vikingsteve
83
参数索引从0开始。(与C语言不同,它会为你提供程序的名称) - AdrieanKhisbe
1
@Daniel,无论操作系统如何,args是否保证由空格分隔? - Pacerier
1
@Luke,这不可能是真的,至少在Unix系统上不是。在那里,shell根据其规则(相应地删除引号/转义)将参数传递给程序。程序(在本例中为Java解释器)无法访问原始未拆分的命令行,也不应该希望这样做,因为它会让用户感到困惑。 - regnarg
1
如果未来的某个用户想知道main方法如何接收参数-首先,参数按照shell规则传递给JVM。大多数shell使用空格进行分割。然后JVM为您初始化一个填充有参数的String[]。然后将此数组作为参数传递给main方法。 - MC Emperor
显示剩余3条评论

131

这些是 Java 中的命令行参数。

换句话说,如果您运行

java MyProgram one two

那么 args 就包含:

[ "one", "two" ]

public static void main(String [] args) {
    String one = args[0]; //=="one"
    String two = args[1]; //=="two"
}

这样做的原因是为了配置你的应用程序以特定的方式运行或提供它所需的一些信息。


如果您刚接触Java,我强烈推荐阅读官方的Oracle Java™教程


48

args包含在Java程序调用时传递给程序的命令行参数。例如,如果我这样调用程序:

$ java MyProg -f file.txt

那么args将是一个包含字符串"-f""file.txt"的数组。


我必须先使用 javac MyProg.java 编译我的代码,然后运行 java MyProg -f file.txt。这是有原因的吗?因为在答案中没有提到。 - stanimirsp
@stanimirsp:你必须先将Java源代码编译成.class文件。 - mipadi
@stanimirsp 你可以查看https://dev59.com/OG435IYBdhLWcg3wrSBB。虽然这不是针对Java的,但是Java中的编译共享大部分优势。 - Fileland

40

以下答案基于我的理解和一些测试。

String[] args是什么?

答:

String[] -> 我们知道这是一个简单的字符串数组。

args -> 是数组的名称,它可以是任何东西(例如a、ar、argument、param、parameter)编译器没有问题,并且可以正确执行,我也进行了测试。

例如:

  1. public static void main(String[] argument)

  2. public static void main(String[] parameter)

何时使用这些args?

答->

main函数是开发人员非常巧妙地设计的。实际上,思考非常深刻。 它基本上是在考虑基于命令行参数的C和C++的情况下开发的,但现在没有人再使用它了。

1-用户可以从命令行输入任何类型的数据,可以是数字或字符串,必须由编译器接受,我们应该使用哪种数据类型?请参阅第2个问题

2-字符串是支持所有原始数据类型的数据类型,如Java中的int、long、float、double、byte、short和char。您可以将其轻松解析为任何原始数据类型。

例如:以下程序已编译并执行,我也进行了测试。

如果输入是 -> 1 1

// one class needs to have a main() method
public class HelloWorld
{
  // arguments are passed using the text field below this editor
  public static void main(String[] parameter)
  {    
System.out.println(parameter[0] + parameter[1]); // Output is 11

//Comment out below code in case of String
    System.out.println(Integer.parseInt(parameter[0]) + Integer.parseInt(parameter[1])); //Output is 2
    System.out.println(Float.parseFloat(parameter[0]) + Float.parseFloat(parameter[1])); //Output is 2.0    
    System.out.println(Long.parseLong(parameter[0]) + Long.parseLong(parameter[1])); //Output is 2    
    System.out.println(Double.parseDouble(parameter[0]) + Double.parseDouble(parameter[1])); //Output is 2.0    

  }
}

4
这个答案是最好的,应该被评为最高分。 - Liker777
如果我在String args[]的位置使用(任何其他数据类型)int ar[],会发生什么?@Ajinkya - chandru
1
@chandru - 这将编译代码但无法运行。 - Ajinkya

19

虽然 OP 只谈到了 String[] args,但我想给出一个完整的例子:public static void main(String[] args)

Public:是一个访问修饰符,它定义了谁可以访问这个方法。Public 表示该方法将被任何类访问(如果其他类能够访问此类)。

Static:是一个关键字,用于标识与类相关的事物。这意味着给定的方法或变量不是实例相关的,而是类相关的。它可以在不创建类实例的情况下访问。

Void:用于定义方法的返回类型。它定义了方法可以返回什么。Void 表示该方法不会返回任何值。

Main:是方法的名称。JVM 将搜索此方法名称作为具有特定签名的应用程序的起始点。

String[] args:是主方法的参数。

如果您查看 JDK 源代码(jdk-src\j2se\src\share\bin\java.c):

/* Get the application's main method */
mainID = (*env)->GetStaticMethodID(env, mainClass, "main",
                   "([Ljava/lang/String;)V");
...
{    /* Make sure the main method is public */
...
mods = (*env)->CallIntMethod(env, obj, mid);
if ((mods & 1) == 0) { /* if (!Modifier.isPublic(mods)) ... */
    message = "Main method not public.";
    messageDest = JNI_TRUE;
    goto leave;
...

你可以看到在Java中启动方法必须命名为main并且必须具有特定的签名public static void main(String[] args)

代码还告诉我们public static void main(String[] args)不是固定的,如果你将(jdk-src\j2se\src\share\bin\java.c)中的代码更改为另一个签名,它仍然可以工作,但更改这个可能会导致其他可能的问题,因为Java 规范


13

我想要分手

public static void main(String args[])

部分地。

"public" 表示可以从任何地方调用 main()。

"static" 表示 main() 不属于特定的对象。

"void" 表示 main() 不返回任何值。

"main" 是一个函数的名称。main() 很特殊,因为它是程序的起点。

"String[]" 表示 String 数组。

"args" 是 String[] 的名称(在 main() 内部)。"args" 并不特殊;你可以用任何其他名称代替它,程序仍然能正常运行。

  • String[] args 是一组由空格分隔的字符串,可以在终端上键入到程序中。大多数情况下,初学者不会使用此变量,但它总是在那里以防万一。

2
你在 args 中使用了方括号,而不是在 String 中。这是有意为之吗? - Fahim
如果我在String args[]的位置使用(任何其他数据类型)int ar[]会发生什么?@jaimin Patel - chandru
@chandru 不行,会抛出错误: 错误:在类Main中找不到主方法,请定义主方法为: public static void main(String[] args) - Flash Noob

12

String [] args是在Java中声明字符串数组的方式。

在这个方法签名中,当方法被调用时,数组args将被填充值(如此处的其他示例所示)。然而,由于你正在学习,值得理解的是,这个args数组就像在方法中自己创建一个数组一样,例如:

public void foo() {
    String [] args = new String[2];
    args[0] = "hello";
    args[1] = "every";

    System.out.println("Output: " + args[0] + args[1]);

    // etc... the usage of 'args' here and in the main method is identical
}

10

简单易懂的解释。

主方法希望我们在将JVM指向类名时提供一些参数。也就是说,假设你的文件名是Try.java,在命令提示符中执行"javac Try.java"进行编译,然后执行"java Try"运行。现在假设你不仅仅写了"java Try",而是写了"java Try 1",这里你传递了一个参数"1"。即使你的代码中没有使用它,这个参数也会被主方法接收。

如果你想检查主方法是否真的接收了参数"1",只需在主方法内输入以下内容:

for(int i = 0; i < args.length; i++) {
        System.out.println("Argument is: "+args[i]);
    }

9

当你完成代码后,你需要将其转换成一个扩展名为.java的文件,可以通过双击运行,也可以通过控制台(mac上的终端,Windows上的cmd.exe)运行,让用户进行许多操作。其中一项是他们可以看到控制台消息(System.out.print或System.out.println),如果他们双击运行则无法看到这些信息。另一件事是他们可以指定参数,因此通常你会使用该行:

java -jar MyCode.jar

在导航到该程序文件夹后,使用

cd C:My/Code/Location

在Windows或者
cd My/Code/Location

在 Mac 上(注意 Mac 更加简洁),运行代码时,若需指定参数,您可以使用。
java -jar MyCode.jar parameter1 parameter2

这些参数存储在 args 数组中,如果你希望允许用户控制特殊参数,例如使用哪个文件或者程序使用多少内存,那么你可以在程序中使用这些参数。如果你想了解如何使用数组,你可以在本站找到相关主题或者通过谷歌搜索。需要注意的是,任意数量的参数都可以被使用。

8

当从控制台执行Java类时,会调用main方法。为了实现这一点,必须定义此主要方法

public static void main(String [])

这个字符串数组被称为args是一种标准惯例,但不是必须的。当您调用程序时,您可以在命令行中填充此数组。
java MyClass a b c

这些通常用于定义程序的选项,例如要写入或读取的文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接