我正在使用Apache Commons CLI库进行命令行解析。它适用于String值选项,但我不确定如何干净地处理布尔值的命令行标志。我试过这个:
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" )
返回true或false,但是从文档中不清楚这意味着什么 - 它是否意味着用户指定了它并且它可能是true还是false?或者它是否意味着标志被激活?如果你想让一个标志默认为true,并让用户将其关闭(如其他getopt解析器中的--noParseOnly),该怎么办?
我会感谢人们提出的任何建议,包括RTFM--我相信这是一个很好的基础。感谢。
答案 0 :(得分:5)
对于布尔选项(或标志),如果找到该选项,则选项值为true,否则值为false。
因此,如果用户指定-parseOnly
,那么这意味着它是真的。如果-parseOnly不存在,那么用户不想要它并且它是假的。
所以你需要做的就是:
if( cl.hasOption( "parseOnly" ) ){
//do something
}
另一点:不要将字符串强制转换为布尔值。相反,使用Boolean.valueOf(cl.getOptionValue("parseOnly"))
将String转换为布尔值。
答案 1 :(得分:0)
我检查了源文件,getParsedOptionValue()根据Option.getType()解析选项字符串参数,您可以使用OptionBuilder.withType()进行设置。问题是only works with a limited set of types(数字,日期等),例如,它甚至不能与Integer一起使用。
那就是说,你应该为布尔值使用零参数标志选项,而不是带参数的选项,因为用户通常希望键入' - parse-only'或者根本没有,不是' - 仅解析为真|假'。这可能是getParsedOptionValue()不支持布尔类型的原因。