5

我正在使用 Apache Commons CLI 库进行命令行解析。它适用于字符串值选项,但我不确定如何干净地处理布尔值命令行标志。我试过这个:

    CommandLineParser parser = new GnuParser();
    Options options = new Options();
    options.addOption(new Option("parseOnly", "Only parse"));
    CommandLine cl = parser.parse( options, args );

    if( cl.hasOption( "parseOnly" ) )
    PARSE_ONLY = (Boolean) cl.getParsedOptionValue( "parseOnly" );

但这NullPointerException在文件行上失败,因为cl.getParsedOptionValue()返回null并且不能转换为Boolean.

cl.hasOption( "parseOnly" )返回真或假,但从文档中不清楚这意味着什么 - 这是否意味着用户指定了它并且它可能是真或假?或者这是否意味着标志被激活?如果您希望一个标志默认为真,并让用户将其关闭(如其他 getopt 解析器中的 --noParseOnly )怎么办?

我会很感激人们提出的任何建议,包括 RTFM - 我相信这是一个很好的基础。谢谢。

4

2 回答 2

8

对于布尔选项(或标志),如果找到选项,则选项值为真,否则值为假。

因此,如果用户指定-parseOnly,则表示它为真。如果 -parseOnly 不存在,则用户不想要它并且它是错误的。

所以你需要做的就是:

 if( cl.hasOption( "parseOnly" ) ){
    //do something
 }

另一点:不要将字符串转换为布尔值。相反,用于Boolean.valueOf(cl.getOptionValue("parseOnly"))将字符串转换为布尔值。

于 2010-09-15T21:43:47.100 回答
0

我检查了源文件,getParsedOptionValue () 根据 Option.getType() 解析选项字符串参数,您可以使用 OptionBuilder.withType() 进行设置。问题是它只适用于有限的一组类型(数字、日期等),例如,它甚至不适用于整数。

也就是说,您应该对布尔值使用零参数标志选项,而不是带参数的选项,因为用户通常希望输入“--parse-only”或根本不输入,而不是“--parse-only true|false”。这可能是 getParsedOptionValue() 不支持 Boolean 类型的原因。

于 2014-10-14T10:55:45.390 回答