2010-09-15 2 views
1

Я получаю мочи от библиотеки CLI Apache Commons для синтаксического анализа командной строки. Он отлично работает для опций с параметрами String, но я не уверен, как правильно обрабатывать логические флаги командной строки. Я попытался это:Варианты CLI Java boolean

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? Или это означает, что флаг активирован? Что делать, если вы хотите, чтобы флаг был по умолчанию истинным, и позволить пользователю отключить его (например, --noParseOnly в других анализаторах getopt)?

Я буду благодарен за любые предложения, которые есть у людей, включая RTFM - я уверен, что это хорошо проторенная земля. Благодарю.

+0

использовать 'Boolean.valueOf (cl.getParsedOptionValue (" parseOnly "))' для преобразования строки в boolean – dogbane

+0

'cl.getParsedOptionValue()' не возвращает строку, она возвращает объект, а документы говорят: Верните версию этого параметра, преобразованную в определенный тип. " К сожалению, он не говорит, как определяется этот конкретный тип. –

ответ

4

Для логических опций (или флагов), если опция найдена, значение параметра равно true, иначе значение равно false.

Следовательно, если пользователь указывает -parseOnly, это означает, что это правда. Если -parseOnly нет, то пользователь не хочет его, и он неверен.

Так все, что вам нужно сделать, это:

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

Еще один момент: Не отвергни строку в булево. Вместо этого используйте Boolean.valueOf(cl.getOptionValue("parseOnly")) для преобразования строки в boolean.

+0

В этом случае, как мне обрабатывать параметр со значением по умолчанию true, который я хочу, чтобы вызывающий мог отключить? Сделайте отдельную опцию «noParseOnly» (но потом я быстро исчерпаю однобуквенные сокращения)? Пусть он принимает значение, подобное '--parseOnly = 0' (но тогда обработка усложняется)? Не уверен. –

+0

Что касается 'Boolean.valueOf()' - см. Мой комментарий выше, 'getParsedOptionValue()' возвращает объект (неизвестного типа), а не строку. –

+0

use getOptionValue(), который возвращает строку, а не getParsedOptionValue(). – dogbane

0

Я проверил исходные файлы, а getParsedOptionValue() разбирает аргумент строки опций в соответствии с Option.getType(), который вы можете установить с помощью OptionBuilder.withType(). Проблема в том, что это only works with a limited set of types (Number, Date и т. Д.) И, например, он даже не работает с Integer.

Сказанное: вы должны использовать опции флагов с нулевым аргументом для booleans, а не с параметрами с аргументами, так как обычно пользователь должен набирать '--parse-only' или ничего вообще, а не '--parse-only true | ложь». Вероятно, это причина, по которой getParsedOptionValue() не поддерживает булевский тип.