【问题标题】:Java boolean CLI optionsJava 布尔 CLI 选项
【发布时间】:2010-09-15 21:25:09
【问题描述】:

我正在使用 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" );

但是由于cl.getParsedOptionValue() 返回null 并且不能转换为Boolean,所以这会失败并在文件行上显示NullPointerException

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

我会很感激人们提出的任何建议,包括 RTFM - 我确信这是一个成熟的领域。谢谢。

【问题讨论】:

  • 使用Boolean.valueOf(cl.getParsedOptionValue("parseOnly")) 将字符串转换为布尔值
  • cl.getParsedOptionValue() 不返回字符串,它返回一个对象,并且文档说“返回转换为特定类型的此选项的版本。”不幸的是,它没有说明该特定类型是如何确定的。

标签: java apache-commons getopt


【解决方案1】:

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

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

所以你需要做的就是:

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

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

【讨论】:

  • 在这种情况下,我如何处理默认值为 true 的选项,我希望调用者能够关闭该选项?制作一个单独的noParseOnly 选项(但我很快就用完了单字母缩写)?让它取一个像--parseOnly=0 这样的值(但随后处理变得更加复杂)?不确定。
  • 关于Boolean.valueOf() - 请参阅我上面的评论,getParsedOptionValue() 返回一个对象(类型未知),而不是字符串。
  • 使用返回字符串的 getOptionValue(),而不是 getParsedOptionValue()。
【解决方案2】:

我检查了源文件,getParsedOptionValue() 根据 Option.getType() 解析选项字符串参数,您可以使用 OptionBuilder.withType() 进行设置。问题在于它only works with a limited set of types(数字、日期等),例如,它甚至不适用于整数。

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

【讨论】:

    猜你喜欢
    • 2011-12-19
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 2016-01-11
    • 2017-10-28
    • 1970-01-01
    • 2012-05-09
    • 2018-03-11
    相关资源
    最近更新 更多