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

问题描述 投票:0回答:6

我想为我的命令行参数做一些错误检查

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

然而,这会返回一个数组越界异常,这是有道理的。我只是在寻找正确的用法。

java command-line command-line-arguments
6个回答
174
投票

争论永远不可能是

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);
  }
}

19
投票

@jjnguy 的回答在大多数情况下都是正确的。如果通过运行应用程序调用

null
以正常方式从命令行运行,您将永远不会在参数数组(或
null
数组)中看到
main
字符串。

但是,如果应用程序的其他部分调用了一个

main
方法,可以想象它可能会传递一个
null
参数或
null
参数数组。

但是 (2),这显然是一个非常不寻常的用例,and 这是对

main
入口点方法的隐含合同的严重违反。因此,我认为您不应该费心检查
null
中的
main
参数值。万一它们确实发生了,调用代码获得
NullPointerException
是可以接受的。毕竟是调用方的bug违约了


12
投票

扩展这一点:

args 变量本身可能为空,但不是通过正常执行。正常执行将使用

java.exe
作为命令行的入口点。然而,我看到一些程序使用编译过的
C++
代码和JNI来使用
jvm.dll
,完全绕过java.exe。在这种情况下,可以将
NULL
传递给 main 方法,在这种情况下 args 将为空。

我建议根据您的需要始终检查

if ((args == null) || (args.length == 0))
,或
if ((args != null) && (args.length > 0))


1
投票

你应该检查

(args == null || args.length == 0)
。虽然
null
检查并不是真正需要的,但这是一个很好的做法。


0
投票

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

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:

那么我该如何解决这个问题,我可以检查第二个争论是否通过,如果通过则输入它。 尽快需要帮助。


-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);
        }

    }

© www.soinside.com 2019 - 2024. All rights reserved.