尽管adamreeve提供的答案非常好并且我接受它,但我决定扩展默认解析器功能以防止输入无效选项,即使没有“-”或“--”符号。我制作了自己的自定义解析器:
public class StrictParser extends Parser {
@Override
protected String[] flatten(Options opts, String[] arguments, boolean stopAtNonOption) {
return arguments;
}
@Override
public CommandLine parse(Options options, String[] arguments, boolean stopAtNonOption) throws ParseException {
CommandLine cmd = null;
List<String> tokenList = Arrays.asList(flatten(getOptions(), arguments, stopAtNonOption));
ListIterator<String> iterator = tokenList.listIterator();
boolean eatTheRest = false;
setOptions(options);
cmd = super.parse(options, arguments, stopAtNonOption);
while (iterator.hasNext()) {
String token = (String) iterator.next();
if (!token.startsWith("--") && !token.startsWith("-")) {
if (stopAtNonOption) {
throw new UnrecognizedOptionException("Unrecognized option: " + token +". Every option must start with '--' or '-'", token);
}
} else {
eatTheRest = true;
}
if (eatTheRest) {
iterator.next();
}
}
return cmd;
}
}
在此解决方案中,任何键入的不带“--”或“-”的 cli 参数都会引发 UnrecognizedOptionException。这不是完美的解决方案,但它展示了它是如何完成的,并且可以成为其他解决方案的良好起点。例如,我们可以接受不带“--”和“-”的选项,但检查该选项是否正确。那么我们需要改变
if (stopAtNonOption) {
throw new UnrecognizedOptionException("Unrecognized option: " + token +". Every option must start with '--' or '-'", token);
}
到
if (stopAtNonOption) {
if(!getOptions().hasOption(token)){
throw new UnrecognizedOptionException(
"Unrecognized option: " + token, token);
}
}
(忽略这个丑陋的三个嵌套 if ;))每个选项也只接受一个参数,但正如我已经提到的,它只是实现对默认解析器的其他修改的起点