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

99

我想对我的命令行参数进行一些错误检查

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

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

6个回答

178

这些参数永远不可能是 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);
  }
}

20

@jjnguy的回答在大多数情况下是正确的。如果以正常方式从命令行运行应用程序,则在参数数组中(或null数组)不会看到null字符串。

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

然而(2),这显然是一个非常不寻常的用例,同时也是对main入口点方法的隐含约定的严重违反。因此,我认为您不应该费心在main中检查null参数值。如果它们确实发生了,呼叫代码收到NullPointerException是可以接受的。毕竟,违反合同是调用方的错误。


12

进一步阐述这一点:

虽然正常执行不会导致args变量本身为空,但是通过使用java.exe作为命令行的入口点。然而,我见过一些程序使用编译的C++代码和JNI来使用jvm.dll,完全绕过了java.exe。在这种情况下,有可能将NULL传递给主方法,此时args将为空。

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


1
你应该检查 (args == null || args.length == 0)。虽然 null 检查并不是必须的,但这是一个好习惯。

2
不必要的检查并不是好的实践。null 检查是不必要的,但你是正确的,length 检查是必要的。 - Stephen C

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:

那么我该如何解决这个问题,以便可以检查第二个参数是否已传递,如果已传递,则输入它。急需帮助。


1
请将此转化为问题形式。由于它并没有回答问题,所以不适合在这里。通过提出一个问题,您有更好的机会得到答案。 - AlexH

-10

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


public static void main(String[] args) throws InterruptedException {
        String [] dummy= new String [] {};
        if(dummy[0] == null)
        {
            System.out.println("正确的用法是:java程序文件名");
            System.exit(0);
        }
}

1
这是完全不正确的。如果一个应用程序没有使用命令行参数启动,那么main方法将被调用,并且其args数组的长度为零。 - Stephen C
一个没有任何元素的数组,长度为零。那么我的答案有什么问题吗? - Puspendu Banerjee
1
好的 - 我现在明白了。如果你没有打错第一句话,那会更有帮助。按照你写的方式,它是无法理解的。我注意到你在最后一条评论中悄悄地纠正了它。真狡猾。 - Stephen C
没有明说,同时又暗示我没有仔细阅读你的答案。这就是狡猾的地方! - Stephen C
1
我并没有提供任何解决方案,而是试图描述这个问题。 - Stealth Rabbi
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接