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" ]
请建议。
答案 0 :(得分:5)
查看ProcessBuilder
的源代码,有一个方法isQuoted
检查是否引用了String参数,如果是,则抛出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匹配可执行文件(在您的情况下是整个字符串)。在您向我们展示的字符串中,您的可执行文件被引用(或者至少以一个开头),因此该方法将抛出IllegalArgumentException
。
您的堆栈跟踪
确认了这一点at java.lang.ProcessImpl.<init>(ProcessImpl.java:69)
这意味着你的构造函数。
将命令列表中的每个参数拆分为列表中的单独String元素。不要在可执行文件周围加上引号。
答案 1 :(得分:0)
我怀疑你需要一个'n'参数列表。
它目前正在将您的第一个列表条目解释为可执行文件,这显然不正确,因为它也包含了您的参数。
答案 2 :(得分:0)
请确保在ProcessBuilder中传递参数commandInformation is a String array or a List<String>.
参数:command包含程序及其的字符串数组 参数
Parameters:
command The list containing the program and its arguments
Oracle Docs.说明了IllegalArgumetnException的原因之一。
我还注意到.jpg.jpg
中包含的文件名。
不应该是fileName.jpg