命令行args没有价值,但代码给出了输出?

Sup*_*tar 3 java

我在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"); 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑 -

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

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

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

ctn*_*ctn 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");
}
Run Code Online (Sandbox Code Playgroud)

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

args = new String[0]; // create a new, empty array of strings
Run Code Online (Sandbox Code Playgroud)

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

null数组和空数组之间存在差异.首先,数组不仅仅是一组值.它需要一个存储2个主要内容的容器:实际值和长度变量(这样您不必每次都计算值).这个容器(Java类)也需要存储.它需要分配.

如果你这样做:

String[] args;
Run Code Online (Sandbox Code Playgroud)

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

如果你这样做:

String[] args = new String[0];
Run Code Online (Sandbox Code Playgroud)

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