如何检测 Java 中是否找不到 ProcessBuilder 执行的文件?

How can I detect if file not found for execution by ProcessBuilder in Java?

我有这部分代码,应该在 Windows 上启动 msg.exe 子进程:

    ProcessBuilder pb = new ProcessBuilder("msg.exe");
    try {
        proc = pb.start();
    } catch (IOException  ex) {
        jLabel4.setText("Cannot launch message box process");
        return;
    }

现在我尝试 delete/rename msg.exe 并且没有抛出异常:catch 子句中的两行都没有执行。 如何检测进程构建器是否找不到要执行的文件?

如果我尝试捕获 FileNotFoundException,它说这个已经被捕获(可能是 IOException 的一部分)。如果我尝试只捕获 FileNotFoundException,它需要捕获带有警告的 IOException。

可以从同一实例重复调用 start() 方法来创建具有相同或相关的新子流程attributes.Each流程构建器管理这些流程属性

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;
        }
}

执行了上面的class:没有错误

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 -异常被捕获,删除代码后相同

您是否尝试在 main class 中执行并再次检查?

你的代码不会抛出 FileNotFoundException ,它会抛出 IOException

Documentation

下面是我得到的异常,因为我在 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

我在黑暗中拍摄:

您的 Java 应用程序目录中有一个名为 "msg.exe" 的可执行文件,您正试图从 Java 代码中执行它。重命名或删除文件时,您期望 new ProcessBuilder("msg.exe").start() 抛出 IOException.

这不会发生,因为如果目录中没有名为 "msg.exe" 的文件,那么它将在您的 %PATH% 中搜索它,最后在 C:\Windows\System32\ 中找到它,这可能不是你想要的。

这个难题可以通过显式声明您要执行的文件必须存在于当前目录中来解决:new ProcessBuilder("./msg.exe")