5

我的印象是 main 方法必须具有“public static void main (String[] args){}”的形式,你不能传递 int[] 参数。

但是,在 Windows 命令行中,当运行以下 .class 文件时,它接受 int 和 string 作为参数。

例如,使用此命令将给出输出“stringers”:“java IntArgsTest stringers”

我的问题是,为什么?为什么这段代码会接受一个字符串作为参数而没有错误?

这是我的代码。

public class IntArgsTest 
{
    public static void main (int[] args)
    {

        IntArgsTest iat = new IntArgsTest(args);

    }

    public IntArgsTest(int[] n){ System.out.println(n[0]);};

}
4

4 回答 4

19

传递给 main 方法的所有东西,JVM 用来启动程序的方法,都是一个字符串,所有东西。它可能看起来像 int 1,但它实际上是字符串“1”,这是一个很大的不同。

现在有了您的代码,如果您尝试运行它会发生什么?当然它可以编译得很好,因为它是有效的 Java,但是你的 main 方法签名与 JVM 要求的作为程序起点的签名不匹配。

为了让您的代码运行,您需要添加一个有效的 main 方法,例如,

public class IntArgsTest {
   public static void main(int[] args) {

      IntArgsTest iat = new IntArgsTest(args);

   }

   public IntArgsTest(int[] n) {
      System.out.println(n[0]);
   };

   public static void main(String[] args) {
      int[] intArgs = new int[args.length];

      for (int i : intArgs) {
         try {
            intArgs[i] = Integer.parseInt(args[i]);
         } catch (NumberFormatException e) {
            System.err.println("Failed trying to parse a non-numeric argument, " + args[i]);
         }
      }
      main(intArgs);
   }
}

然后在调用程序时传入一些数字。

于 2012-04-17T00:49:04.153 回答
2

好吧,您可以使用任何名称main和任意数量的参数的方法。但是 JVM 会寻找main具有确切签名的方法public static void main(String[])

您定义的main方法只是该类的另一种方法。

我现在无法访问 Windows,但让我过会儿试试。我确实尝试过 Fedora,当然我得到了以下异常:

Exception in thread "main" java.lang.NoSuchMethodError: main

请注意,由于上述原因,该类可以正常编译。

更新:我在 Windows 7 上测试过,结果是一样的。我很惊讶你说它对你有用。

于 2012-04-17T00:51:07.020 回答
1

此代码实际上不会运行。当代码编译时(因为你不需要 main 来编译),当你尝试运行它时,你会得到一个"Main method not found"错误。

更好的是,当我运行它时,它说

 "please define the main method as: public static void main(String[] args)
于 2012-04-17T00:50:50.487 回答
1

此代码包含不起作用的public static void main (int[] args) 。因为 JVM 将参数值作为字符串参数。它不需要任何 int 参数。因此,如果我们想要一个 int 参数意味着我们必须将字符串参数转换为整数参数。要运行此代码,需要有效的 main 方法(例如:public static void main(String args[])

于 2014-07-01T10:31:03.197 回答