1

プログラムの引数として指定されたオプションが無効な場合 (事前定義されたオプション リストで使用できない場合)、使用方法のヘルプ メッセージを出力したいと考えています。

      CommandLineParser parser = new BasicParser();
    try {
        CommandLine line = parser.parse(getOptions(), args);
    }
    catch( ParseException exp ) {
        getLogger().info("Invalid command line option name. "+exp.getMessage());
        HelpFormatter hf = new HelpFormatter();
        hf.printHelp("destDir", getOptions());
        return false;
    }       
    return true;

パラメータとして「Test」文字列を入力します。無効なオプションによりパーサーが ParseException をスローすると考えていましたが、そうではありません。どうすればその動作を達成できますか? このライブラリではまったく可能ですか? 現在は、無効なパラメーターを省略しています。

UPDATE 実際には、オプションに「-」プレフィックスがある場合、例外がスローされます。したがって、「-Test」は例外をスローしますが、「Test」はそうではありません。とにかく私の質問はまだ有効です。パーサーに無効なパラメーターで例外をスローさせる方法

4

3 に答える 3

0

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);
            }
        }

(この醜い 3 つの入れ子になった if は無視してください;)) これもオプションごとに 1 つの引数しか受け入れませんが、前述したように、デフォルトのパーサーに他の変更を実装するための出発点にすぎません。

于 2016-11-03T07:56:05.030 に答える
-1

はい、できます。次のようなカスタム例外を作成する必要があります。

public class ParseException extends Exception{
        ParseException(String msg){
             super(msg);  
        }
}

そしてコードに:

CommandLineParser parser = new BasicParser();
    try {
        CommandLine line = parser.parse(getOptions(), args);
    }
    catch( Exception exp ) {
       throw new ParseException("Invalid Arguments");
    }       
    return true;

そして、上記のメソッドはスローする必要があります

throws ParseException

したがって、無効な引数を渡すと、その呼び出し元は ParseException を取得します

于 2016-10-17T09:13:28.653 に答える