Java:检查命令行参数是否为空


89

我正在寻找一些针对我的命令行参数的错误检查

public static void main(String[] args)
{
    if(args[0] == null)
    {
        System.out.println("Proper Usage is: java program filename");
        System.exit(0);
    }
}

但是,这将返回超出范围的数组异常,这是有道理的。我只是在寻找正确的用法。

Answers:


159

参数永远不能是null。他们只是不存在。

换句话说,您需要做的是检查参数的长度。

public static void main(String[] args)
{
    // Check how many arguments were passed in
    if(args.length == 0)
    {
        System.out.println("Proper Usage is: java program filename");
        System.exit(0);
    }
}

18

@jjnguy的答案在大多数情况下是正确的。如果通过运行应用程序以正常方式从命令行运行而调用null了参数数组(或null数组),您将永远不会在参数数组(或数组)中看到字符串main

但是,如果应用程序的其他部分调用main方法,则可以想象它可能会传递null参数或null参数数组。

但是(2),这显然是一个极不寻常的用例,并且它是一个严重违反了隐含合同的main入口点的方法。因此,我认为您不必费心检查中的null参数值main。如果确实发生这种情况,则调用代码获得a是可以接受的NullPointerException。毕竟,违反合同是呼叫者的错误。


11

在这一点上展开:

args变量本身可能为null,但不能通过正常执行。正常执行将java.exe用作命令行的入口点。但是,我看到一些程序使用C++JNI的已编译代码来使用jvm.dll,从而完全绕过java.exe。在这种情况下,可以传递NULL给main方法,在这种情况下args将为null。

我建议始终检查if ((args == null) || (args.length == 0)),或者if ((args != null) && (args.length > 0))根据您的需要。


0

您应该检查(args == null || args.length == 0)。尽管null确实不需要检查,但这是一个好习惯。


1
不必要的检查不是一个好习惯。该null检查是不必要的,但您正确地认为该length检查是必要的,
Stephen C

0

如果我想检查命令行参数的特定位置是否通过,那么如何检查?例如,在某些情况下,将传递2个命令行参数,而在某些情况下将仅传递一个参数,那么如何检查特定的commnad行是否通过?

public class check {

public static void main(String[] args) {
if(args[0].length()!=0)
{
System.out.println("entered first if");
}
if(args[0].length()!=0 && args[1].length()!=0)
{
System.out.println("entered second if");
}
}
}

因此,在上面的代码中,如果未传递args [1],那么我将得到java.lang.ArrayIndexOutOfBoundsException:

所以我该如何解决这个问题,在这里我可以检查是否通过了第二项辩论,如果通过了,请输入第二项。尽快需要帮助。


请问这个问题。由于它不能回答问题,因此不属于此处。通过提问,您更有可能获得答案。
AlexH

-10

如果您不传递任何参数,那么即使在这种情况下,args也会被初始化但没有任何项目/元素。尝试以下一项,您将获得相同的效果

 
public static void main(String[] args) throws InterruptedException {
        String [] dummy= new String [] {};
        if(dummy[0] == null)
        {
            System.out.println("Proper Usage is: java program filename");
            System.exit(0);
        }

    }


1
这是完全不正确的。如果启动的应用程序没有命令行参数,main则将使用args长度为零的数组调用该方法。
斯蒂芬·C

@Stephen数组内部没有任何元素,长度为零。那我的答案怎么了?
Puspendu Banerjee,2010年

@Puspendu-出问题的是,dummy[0]数组索引超出范围!同理,如果您将程序(返回)更改为测试args[0]并不带任何参数地运行它。
斯蒂芬·C

1
好的我现在明白了。如果您没有输错第一句话,那将会有所帮助。如所写,这是难以理解的。我注意到您在最近的评论中悄悄地纠正了它。鬼S
斯蒂芬·C

1
“我没有给出任何解决方案,而是试图描述这个问题”。然后不要发布答案。发表评论。
隐形拉比2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.