0

プログラムに与えられた引数を解析するためにargs4jを使用しています。

これは、日付型の2つの引数を定義するコードです。ハンドラーは、指定された日付を解析し、日付が不正な場合はCommandLineExceptionをスローします。

@Option(name="-b", metaVar="<beginDate>", handler=DateOptionHandler.class, usage="...")
private Date beginDate;

@Option(name="-e", metaVar="<endDate>", handler=DateOptionHandler.class, usage="...")
private Date endDate;

例外をスローするbeginDateまたはendDateの場合は、別のコード(int値)を返すことができる必要があります。

現在、私のメインメソッドは次のようになっています:

CmdLineParser parser = new CmdLineParser(this);
parser.setUsageWidth(120);

try {
    parser.parseArgument(args);
} catch (CmdLineException e) {
    /* Print usage if an error occurs during the parsing */
    System.err.println(e.getMessage());
    System.err.println("Usage : java LaunchProgram [options]");
    e.getParser().printUsage(System.err);

    /* What I need to do : */
    if(optionWhichThrewTheException.equals("-b") return 2;
    if(optionWhichThrewTheException.equals("-e") return 3;

    /* Other arguments */
    return -1;
}

しかし、どの引数が例外をスローしたかを知る方法がわかりません(CmdLineExceptionメソッドを調べましたが、何も見つかりませんでした)。

解析できないパラメータを取得する方法はありますか?

よろしくお願いします。

4

1 に答える 1

1

args4jを使用したことはありませんが、そのドキュメントを見ると、オプションハンドラーによって例外がスローされているようです。したがって、必要な情報を含むCmdLineExceptionのカスタムサブクラスをスローするBDateOptionHandlerとEDateOptionHandlerを使用します。

public class BDateOptionHandler extends DateOptionHandler {
    @Override
    public int parseArguments(Parameters params) throws CmdLineException {
        try {
            super.parseArguments(params);
        }
        catch (CmdLineException e) {
            throw new ErrorCodeCmdLineException(2);
        }
    }
}

public class EDateOptionHandler extends DateOptionHandler {
    @Override
    public int parseArguments(Parameters params) throws CmdLineException {
        try {
            super.parseArguments(params);
        }
        catch (CmdLineException e) {
            throw new ErrorCodeCmdLineException(3);
        }
    }
}

...
try {
    parser.parseArgument(args);
} 
catch (CmdLineException e) {
    ...
    if (e instanceof ErrorCodeCmdLineException) {
        return ((ErrorCodeCmdLineException) e).getErrorCode();
    }
}
于 2012-04-30T14:21:44.983 に答える