2013-08-14 6 views
0
ProcessBuilder pb = new ProcessBuilder(commandInformation); 
Process process = pb.start(); 

Над кодом возвращается:Возвращает java.lang.IllegalArgumentException в ProcessBuilder.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" ] 

Пожалуйста предлагать.

ответ

5

Глядя на исходный код для 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 соответствует исполняемому файлу (в вашем случае вся строка). В строке, которую вы показали нам, ваш исполняемый файл цитируется (или, по крайней мере, начинается с одного), поэтому метод будет вызывать IllegalArgumentException.

Это подтверждается вашим трассировки стека

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

Это означает, что внутри вашего конструктора.

Разделите каждый аргумент в списке команд как отдельный элемент String в списке. Не помещайте кавычки вокруг исполняемого файла.

+0

Thanks @Sotirios Delimanolis –

+0

@RamuPasupuleti Обязательно. Удачи! –

0

Я подозреваю, что вам нужен список аргументов 'n'.

В настоящее время он интерпретирует вашу запись первого списка как исполняемый файл, и это явно не так, поскольку в него также включены ваши аргументы.

+0

Будет ли это выбросить IllegalArgumentException или команда не найдена? –

0

Пожалуйста, убедитесь, что параметр, передаваемый в ProcessBuilder, commandInformation is a String array or a List<String>.

Parameters: command A string array containing the program and its arguments

Parameters: 
command The list containing the program and its arguments 

Source

Oracle Docs., которая гласит одна из причин IllegalArgumetnException.

Также я только что заметил, что имя файла, которое у вас есть, включено в .jpg.jpg. Не должно быть fileName.jpg

+0

@SotiriosDelimanolis. Благодарю. Да, верно. Позвольте мне изменить его. – JNL

+0

Это все еще не отвечает на вопрос. ОП указала _List commandInformation_, с именем 'toString()' '' '' '[" 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

Извините, но как работает 'java.awt.Desktop # open() 'Соответствующий?' ProcessBuilder' использует собственный метод для создания процесса 'using win32 function CreateProcess'. –

Смежные вопросы