【问题标题】:Java: Check if command line arguments are nullJava:检查命令行参数是否为空
【发布时间】:2011-04-21 14:21:26
【问题描述】:

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

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      如果您不传递任何参数,那么即使在这种情况下,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); } }

      【讨论】:

      • 这是完全错误的。如果应用程序在没有命令行参数的情况下启动,则将使用长度为零的 args 数组调用 main 方法。
      • @Stephen 一个内部没有任何元素的数组,长度为零。那我的回答有什么问题呢?
      • @Puspendu - 问题是dummy[0] 抛出数组索引越界异常!!如果您将程序(返回)更改为测试 args[0] 并在不带参数的情况下运行它,则同上。
      • 好的 - 我现在明白了。如果您没有打错第一句话,那会有所帮助。正如所写,它是难以理解的。我注意到你在上一条评论中悄悄地纠正了它。偷偷摸摸。
      • “我没有给出任何解决方案,而是试图描述这个问题”。然后不要发布答案。发表评论。
      【解决方案3】:

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

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

      然而(2),这显然是一个非常不寻常的用例,并且它严重违反了main 入口点方法的隐含合同。因此,我认为您不必费心检查main 中的null 参数值。万一它们确实发生了,调用代码获取NullPointerException 是可以接受的。毕竟,调用者违反合约是一个bug。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 不必要的检查不是好的做法。 null 检查是不必要的,但你是正确的 length 检查是必要的,
        【解决方案5】:

        在这一点上展开:

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

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

        【讨论】:

          【解决方案6】:

          如果我想检查命令行参数的任何特定位置是否通过,那么如何检查? 例如 在某些情况下会传递 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:

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

          【讨论】:

          • 请提出这个问题。因为它不回答问题,所以它不属于这里。通过提出问题,您有更好的机会获得答案。
          猜你喜欢
          • 2016-12-28
          • 1970-01-01
          • 2015-05-28
          • 2017-04-11
          • 2016-04-15
          • 2016-02-09
          • 2018-12-31
          • 2013-02-18
          相关资源
          最近更新 更多