3

我在 Eclipse 中将其作为 Java 应用程序运行。令人惊讶的是,它打印了第一行。我期待它打印第二个。我从来没有在命令行中输入过任何东西,为什么会这样呢?

class Game
{   
    public static void main(String args[])
    {
        if(args != null){
            System.out.println("Lets do something with args");
        }else{
            System.out.println("Cant do something until args is not null"); 
        }
    }
}

编辑 -

还尝试了另一件事来回应其中一个答案。删除 main 中的所有代码并将其替换为 -

System.out.println("Main method..."); 
for(int i = 0; i< args.length; i++){
System.out.println("i = " + i); 
} 

输出是主要方法。为什么 ?

4

6 回答 6

5

args数组是空的,不是null。你需要这样做:

if (args.length > 0) {
    System.out.println("Lets do something with args");
} else {
    System.out.println("Cant do something until args is not empty");
}

在您的程序运行之前,会发生以下情况:

args = new String[0]; // create a new, empty array of strings

在此之后,来自命令行的每个参数(如果有)都将添加到此数组中。然后使用此 args 数组作为参数调用您的 main 函数。

空数组和空数组是有区别的。首先,数组不仅仅是一组值。它需要一个存储两个主要内容的容器:实际值和一个长度变量(这样您就不必每次都计算值)。这个容器(一个 Java 类)也需要存储。它需要分配。

如果你这样做:

String[] args;

你只有一个args类型的变量String[]。它从未被分配,因此它没有存储空间。Java 将其初始化为null. 把它想象null成数字零。这只是一个约定,意味着它没有被初始化。您无法访问argsargs.length例如)中的任何内容,因为应该命名的类 args 尚不存在。如果你尝试,你会得到一个 NullPointerException。

如果你这样做:

String[] args = new String[0];

你现在有一个argstype 变量String[],但它也用一个新String[]类初始化。默认情况下,此数组类没有值且长度为零。但是这个类是存在的。您可以认为args现在是一个数字(地址),不同于零(null在前一种情况下),它标识存储在内存中某处的此类。实际上,当您现在这样做时,args.length您是在告诉 Java 访问由地址argscontains 标识的类(您通常在代码中或任何地方都看不到此地址,Java 会为您处理),并且从内部类获取长度变量。同样,当您这样做时,args[0]您首先从内存中获取类,然后从中检索第一个值。

于 2013-06-13T17:38:41.663 回答
2

如果您不向程序传递任何命令行参数,args则不会是null0-length String[]。尝试打印args.length- 一个null值会引发异常,而一个 0 长度的数组会打印0

于 2013-06-13T17:36:43.010 回答
1

args不是null但是空的。

不是这样调用jvm

               `Game.main(null);`

但与此类似:

        `Game.main(new String[0]);` //in the case of no args.
  1. NULL:因此,如果,当您尝试访问等时String[] args=null,您会得到。所以,这里是 null。NullPointerExceptionargs.lengthargs

  2. EMPTY ARRAY: 但是如果String[] args=new String[0],你就不会遇到这样的问题。

因此,您可以查看数组是否没有元素,在这种情况下args.length为零。所以,args这里是空的。

  `if(args.length>0)` is what you need.

希望这可以帮助。

编辑:

输出是主要方法。为什么 ?

因为args.length在您的情况下为 0 并且i=0, i<args.length,0<0条件失败,因此不进行迭代。

于 2013-06-13T17:41:02.627 回答
0

命令行args只是空[]的,它不是null

于 2013-06-13T17:36:33.697 回答
0

命令行字符串数组不是null它只是空的。它不包含任何元素。

对于您的编辑,输出是main method因为循环也不会迭代一次。这是因为数组的元素为零,因此它也不会一次进入循环。

于 2013-06-13T17:37:36.083 回答
0

数组为空,如果要在 eclipse 中使用参数进行测试,请按照以下步骤操作:

Right click the class -> Run as -> Run Configuration -> Arguments Tab

Program Arguments在文本区域添加一些文本

于 2013-06-13T17:43:01.150 回答