手工处理参数

当应用程序的命令行语法很简单时,完全在自定义代码中执行命令参数处理是合理的。

在这个例子中,我们将介绍一系列简单的案例研究。在每种情况下,如果参数不可接受,代码将产生错误消息,然后调用 System.exit(1) 告诉 shell 命令失败。 (我们将在每种情况下假设使用名称为 myapp 的包装器调用 Java 代码。)

没有参数的命令

在本案例研究中,该命令不需要参数。该代码说明 args.length 为我们提供了命令行参数的数量。

public class Main {
    public static void main(String[] args) {
        if (args.length > 0) {
            System.err.println("usage: myapp");
            System.exit(1);
        }
        // Run the application
        System.out.println("It worked");
    }
}

带有两个参数的命令

在这个案例研究中,命令只需要两个参数。

public class Main {
    public static void main(String[] args) {
        if (args.length != 2) {
            System.err.println("usage: myapp <arg1> <arg2>");
            System.exit(1);
        }
        // Run the application
        System.out.println("It worked: " + args[0] + ", " + args[1]);
    }
}

请注意,如果我们忽略了检查 args.length,如果用户使用太少的命令行参数运行它,命令就会崩溃。

带有 flag 选项和至少一个参数的命令

在本案例研究中,该命令有几个(可选)标志选项,并且在选项后至少需要一个参数。

package tommy;
public class Main {
    public static void main(String[] args) {
        boolean feelMe = false;
        boolean seeMe = false;
        int index;
        loop: for (index = 0; index < args.length; index++) {
            String opt = args[index];
            switch (opt) {
            case "-c":
               seeMe = true;
               break;
            case "-f":
               feelMe = true;
               break;
            default:
               if (!opts.isEmpty() && opts.charAt(0) == '-') {
                   error("Unknown option: '" + opt + "');
               }
               break loop;
            }
        }
        if (index >= args.length) {
            error("Missing argument(s)");
        }      
        
        // Run the application
        // ...
    }

    private static void error(String message) {
        if (message != null) {
            System.err.println(message);
        }
        System.err.println("usage: myapp [-f] [-c] [ <arg> ...]");
        System.exit(1);
   }
}

如你所见,如果命令语法复杂,处理参数和选项会相当麻烦。建议使用命令行解析库; 看其他例子。