У меня есть эта часть кода, которая должна запускать подпроцесс msg.exe в Windows:
ProcessBuilder pb = new ProcessBuilder("msg.exe");
try {
proc = pb.start();
} catch (IOException ex) {
jLabel4.setText("Cannot launch message box process");
return;
}
Теперь я попытался удалить/переименовать msg.exe и не вызвал исключений: обе строки в catch не выполняются. Как я могу определить, не найден ли файл для выполнения конструктором процесса?
Если я попытаюсь поймать FileNotFoundException, он говорит, что этот уже пойман (вероятно, как часть IOException). Если я пытаюсь поймать только FileNotFoundException, для этого требуется выхватить IOException с предупреждением.
Мой выстрел в темноте:
У вас есть исполняемый файл с именем msg.exe в каталоге вашего Java-приложения, которое вы пытаетесь выполнить из вашего Java-кода. При переименовании или удалении файла вы ожидаете new ProcessBuilder("msg.exe").start()
IOException
.
Этого не произойдет, поскольку, если в каталоге нет файла с именем msg.exe, он будет искать его в вашем %PATH%
и, наконец, найти его в C:\Windows\System32\
, что, вероятно, не намеревался.
Эта дилемма может быть решена путем явного указания, что файл, который вы пытаетесь выполнить, должен существовать в текущем каталоге: new ProcessBuilder("./msg.exe")
Метод start() может быть вызван повторно из одного экземпляра для создания новых подпроцессов с одинаковыми или связанными атрибутами. Каждый процесс-построитель управляет этими атрибутами процесса
public static void main(String[] args) {
ProcessBuilder pb = new ProcessBuilder("msg.exe");
// pb.directory(new File("c:\\xyzwsdemo"));
try {
Process proc = pb.start();
} catch (IOException ex) {
System.out.println("Cannot launch message box process");
return;
}
}
выполненный выше класс: Нет ошибки
public static void main(String[] args) {
ProcessBuilder pb = new ProcessBuilder("msfg.exe");
// pb.directory(new File("c:\\xyzwsdemo"));
try {
Process proc = pb.start();
} catch (IOException ex) {
System.out.println("Cannot launch message box process");
return;
}
}
Переименуйте msg.exe в msfg.exe -Exception, после того, как он удалил код
Вы пытались выполнить основной класс и снова проверить?
Ваш код не будет FileNotFoundException
, он выкинет IOException
См. Документацию
Ниже приведено исключение, поскольку я нахожусь в linux, поэтому нет необходимости менять имя msg.exe
на другое, чтобы генерировать исключение
java.io.IOException: Cannot run program "msg.exe": error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
at Neeraj.main(Neeraj.java:8)
Caused by: java.io.IOException: error=2, No such file or directory
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:187)
at java.lang.ProcessImpl.start(ProcessImpl.java:134)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
... 1 more
pb
.