亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

ProcessBuilder 啟動 java 程序:IOException。無法啟動進程。

ProcessBuilder 啟動 java 程序:IOException。無法啟動進程。

一只名叫tom的貓 2023-03-17 17:05:30
我有一個像這樣的簡單類:public class Dog  {  public static void main(String[] args)  {    System.out.println("DOG");    }}它被編譯成Dog.class位于里面C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\Test\classes。我嘗試使用 ProcessBuilder 運行它:public static void main(String[] args) {        String pathName = "-cp \"C:\\Program Files\\Apache Software Foundation\\Tomcat 8.5\\webapps\\Test\\classes" + "\" " + "Dog";        runCode(pathName);     }public static void runCode(String name)  {           System.out.println(name);  //-cp "C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\Test\classes" Dog           ProcessBuilder processBuilder = new ProcessBuilder("java " + name);           processBuilder.redirectError(new File(Paths.get("C:\\Program Files\\Apache Software Foundation\\Tomcat 8.5\\webapps\\JavaStudyRooms\\output.txt").toString()));           processBuilder.redirectInput();       try {           final Process process = processBuilder.start();           try {               final int exitStatus = process.waitFor();               if(exitStatus==0){                   System.out.println("External class  Started Successfully.");                   System.exit(0); //or whatever suits               }else{                   System.out.println("There was an error starting external class. Perhaps path issues. Use exit code "+exitStatus+" for details.");                   System.out.println("Check also output file for additional details.");                   System.exit(1);//whatever               }           } catch (InterruptedException ex) {               System.out.println("InterruptedException: "+ex.getMessage());           }       } catch (IOException ex) {           System.out.println("IOException. Faild to start process. Reason: "+ex.getMessage());       }       System.out.println("Process Terminated.");       System.exit(0);   }為什么會發生這種情況以及如何解決?
查看完整描述

1 回答

?
holdtom

TA貢獻1805條經驗 獲得超10個贊

ProcessBuilder 不使用整個命令行。它需要爭論。


例如,您當前的代碼正在尋找一個基本名稱長度為 90 個字符的程序java -cp … Dog.exe。


您需要傳遞一個參數數組:


// Note the use of a String array, not a single String


public static void runCode(String... javaArgs) {


    List<String> args = new ArrayList<>();

    args.add("java");

    Collections.addAll(args, javaArgs);


    ProcessBuilder processBuilder = new ProcessBuilder(args);

這可以被調用為:


runCode(

    "-cp",

    "C:\\Program Files\\Apache Software Foundation\\Tomcat 8.5\\webapps\\Test\\classes",

    "Dog");

另外,不要只打印異常消息。消息本身很少有用。您通常想要打印整個堆棧跟蹤,這樣您將擁有所有信息并且您將確切地知道問題發生的位置:


   } catch (IOException ex) {

       ex.printStackTrace();

   }


查看完整回答
反對 回復 2023-03-17
  • 1 回答
  • 0 關注
  • 113 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號