Apache Commons CLI:将非法参数传递给选项后没有抛出异常

Apache Commons CLI: no exception thrown after passing illegal arguments to options

我的问题是,当一个不应该接受任何参数的选项被赋予一个参数时,我没有看到任何异常抛出。

只是标准设置,直接来自文档

Options options = new Options();
CommandLineParser parser = new DefaultParser();
CommandLine cmd;

选项:

Option op = Option.builder("op")
                  .longOpt("op")
                  .hasArg(false)
                  .desc("bla")
                  .build();
options.addOption(op);

尝试捕捉:

try {
    cmd = parser.parse(options, args);
    if (cmd.hasOption("op") { //do something }
} catch (ParseException | IllegalArgumentException exp) {
    System.err.println(exp.getMessage());
    System.exit(0);
}

我已经尝试了 Option.Builder class(link) 中提供的所有似乎相关的方法,但其中 none 在 [=13 处抛出异常=] 带有参数,例如 -op hello

在 Apache Commons CLI 中是否存在处理非法选项参数的异常 class 还是我们必须手动执行? (那么像 hasArg(boolean hasArg) 这样的方法有什么意义呢?)

Commons CLI 支持“尾随参数”,即 <options> arg1 [arg2...]

如果您查看 getArgs()getArgList(),您会发现该选项未解析该值,因此它最终出现在尾随参数列表中。

    Option op = Option.builder("op")
            .longOpt("op")
            .hasArg(false)
            .desc("bla")
            .build();

    Options options = new Options();
    options.addOption(op);

    CommandLineParser parser = new DefaultParser();
    CommandLine cmd = parser.parse(options, new String[] {"-op", "bla"});
    assertTrue(cmd.hasOption(op));

    assertEquals("[bla]", cmd.getArgList().toString());
    assertEquals("[bla]", Arrays.toString(cmd.getArgs()));

我没有找到禁止此类尾随参数的方法。

所以如果你想在这种情况发生时失败,你可以检查并抛出异常 if getArgs() returns 一个 non-empty 数组。