簡體   English   中英

如何檢測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;
    }

現在,我嘗試刪除/重命名msg.exe,並且沒有引發異常:catch子句中的兩行都沒有執行。 如何檢測是否未找到要由流程構建器執行的文件?

如果我嘗試捕獲FileNotFoundException,它說這已被捕獲(可能是IOException的一部分)。 如果我嘗試僅捕獲FileNotFoundException,則需要捕獲IOException並帶有警告。

我的鏡頭在黑暗中:

您嘗試從Java代碼執行的Java應用程序目錄中有一個名為“ msg.exe”的可執行文件。 重命名或刪除文件時,期望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-捕獲到異常,刪除代碼后相同

您是否嘗試過在主類中執行並再次檢查?

您的代碼將不會拋出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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM