0
ProcessBuilder pb = new ProcessBuilder(commandInformation);
Process process = pb.start();

上記のコードはエラーを返しています:

java.lang.IllegalArgumentException
    at java.lang.ProcessImpl.<init>(ProcessImpl.java:69)
    at java.lang.ProcessImpl.start(ProcessImpl.java:30)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:452)
    at com.ConvertsImages.SystemCommandExecutor.executeCommand(SystemCommandExecutor.java:51)
    at com.ConvertsImages.ImageConversion.runConvertCommand(ImageConversion.java:115)
    at com.ConvertsImages.ImageConversion.runConvert(ImageConversion.java:80)
    at com.ConvertsImages.ImageConversion.main(ImageConversion.java:26)

リストcommandInformationには、次のように 1 つのエントリしかありません。

["D:\Program Files\ImageMagick-6.8.6-Q16\convert.exe"  "D:\ConvertFiles\ReImport_2507_1.jpg"  -resize 40x40 "D:\ConvertFiles\proxy-40\ReImport_2507_1.jpg.jpg" ]

提案してください。

4

3 に答える 3

5

のソース コードを見ると、String 引数が引用符で囲まれているかどうかをチェックし、引用符で囲まれている場合にスローし、フラグがチェックさProcessBuilderれるメソッドがあります。isQuotedIllegalArgumentException

private static boolean isQuoted(boolean noQuotesInside, String arg,
        String errorMessage) {
    int lastPos = arg.length() - 1;
    if (lastPos >=1 && arg.charAt(0) == '"' && arg.charAt(lastPos) == '"') {
        // The argument has already been quoted.
        if (noQuotesInside) {
            if (arg.indexOf('"', 1) != lastPos) {
                // There is ["] inside.
                throw new IllegalArgumentException(errorMessage);
            }
        }
        return true;
    }
    if (noQuotesInside) {
        if (arg.indexOf('"') >= 0) {
            // There is ["] inside.
            throw new IllegalArgumentException(errorMessage);
        }
    }
    return false;
}

上記は から呼び出されます。フラグgetExecutablePathに注意してくださいtrue

 boolean pathIsQuoted = isQuoted(true, path,
            "Executable name has embedded quote, split the arguments");

ProcessImplコンストラクター内で呼び出される

String executablePath = getExecutablePath(cmd[0]);

cmdリストから作成された配列はどこにありますか。インデックス 0 は、実行可能ファイル (この場合は文字列全体) と一致します。あなたが私たちに示した文字列では、実行可能ファイルが引用されている(または少なくとも引用されている)ため、メソッドはIllegalArgumentException.

これは、スタック トレースによって確認されます

at java.lang.ProcessImpl.<init>(ProcessImpl.java:69)

つまり、コンストラクター内です。

コマンド リスト内の各引数を、リスト内の個別の String 要素として分割します。実行可能ファイルを引用符で囲まないでください。

于 2013-08-14T13:43:20.020 に答える