我对某事感到困惑。我写了一个小代码片段。
import java.util.*;
class AA
{
public static void main(String args[])
{
if(args == null )
{
System.out.println("I am null");
}
else{
System.out.println(args);
}
}
}
这是一个简单的测试。虽然我没有从命令行传递任何东西 作为参数但仍然args不为null,这意味着JVM将其初始化为 类似String数组的东西。为什么有这个背后的具体原因?我好奇 知道。任何指针都会有所帮助。 谢谢, 本
答案 0 :(得分:8)
当你没有传递任何内容时,args
不是null
- 为空:
if(args.length == 0)
{
System.out.println("I am empty");
} else{
System.out.println(args);
}
答案 1 :(得分:4)
它是语义的。如果没有参数,则表示您的参数列表为空,但这并不意味着参数的概念不存在。因此args
列表是一个空数组(即没有参数)而不是null(即参数不存在)。
答案 2 :(得分:2)
如果不是因为JVM本身已经初始化了传递给Java程序的args
函数的main
数组,那么检查null数组是没有错的,所以数组永远不会为null,它只能为空但不能为空。
JVM保证args
数组将被初始化。对null的检查仍然没有错,但它是多余的,并没有多大意义,特别是它没有给你的意义(在命令行上没有传递参数)。
由于数组将始终初始化,您可以确定它不是null并且只执行空检查:
if(argsl.length == 0) {
//Is empty
}
你甚至可以直接遍历数组而不必担心NullPointerException:
for(String arg : args) {
System.out.println(arg);
}
答案 3 :(得分:1)
main
方法的参数将包含从命令行传递的字符串参数。如果没有通过,它仍然不是null
但是大小为0.试试:
public static void main(String[] args) {
System.out.println(args[0]);
}
您可以看到抛出异常:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
答案 4 :(得分:0)
jvm创建并将所有参数作为名为“args”的字符串[]传递。这样做(以及其他原因),以便我们不必检查args对象上的null。这是一件小事,但它节省了很少的时间。
答案 5 :(得分:0)
检查args字符串数组的大小,如果它的值为零而不是其中没有任何内容,并且如果大小大于1,则尝试放置断点(如果使用的是IDE)或迭代数组,以查看数组的内容。