java - 在 ProcessBuilder.start() 中返回 java.lang.IllegalArgumentException

标签 java processbuilder

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只有一项,如下所示:

["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" ]

请提出建议。

最佳答案

查看ProcessBuilder的源代码,有一个方法isQuoted,它检查字符串参数是否被引用,如果是则抛出IllegalArgumentException是并且检查了一个标志。

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 与可执行文件匹配(在您的情况下是整个字符串)。在您向我们展示的字符串中,您的可执行文件被引用(或至少以 1 开头),因此该方法将抛出 IllegalArgumentException

这已由您的堆栈跟踪确认

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

这意味着在你的构造函数内部。

将命令列表中的每个参数拆分为列表中的单独字符串元素。不要在可执行文件两边加上引号。

关于java - 在 ProcessBuilder.start() 中返回 java.lang.IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18233161/

相关文章:

java - 正在将 Java 项目导出为可运行的 Jar : not doing anything

java - 为什么我在 ProcessBuilder --Java 中收到 IllegalThreadStateException 错误?

java - 使用 processBuilder 执行命令

Java ProcessBuilder 限制

Java ProcessBuilder 问题

java - g++ 不适用于 Java

java - 如何将Gradle与Maven合并

java - 正则表达式,替换双引号之间的所有逗号

java - Jaggery 支持过滤吗?

java - Hibernate - 如何在 jUnit 中测试序列映射和策略