關於JAVA Project.waitfor()返回值是1
0條評論
Project.waitfor()返回值是1,找了很久從網上沒有發現關於1的說明。
這時對源代碼調試了一下,發現Project=null.而去根目錄下點擊被調用的bat文件發現也可以被正確執行。
這時想到應該將標准錯誤流的信息打印出來,發現是bat文件的路徑只獲取到了第一個空格前。所以問題的原因是空格導致文件路徑不能被獲取。
原先的代碼
String batpath = file.getCanonicalPath() + "\resources\runTest.bat"; //run bat file Process project = Runtime.getRuntime().exec("cmd.exe /c " + batpath); int exitcode=project.waitFor(); //kill the process project.destroy(); logger.info(exitcode);
修改后的代碼
//run bat file Process project = Runtime.getRuntime().exec("cmd.exe /c " + batpath.replaceAll(" ", "" ""));
此次解決問題的經驗是:
不要盲目的先去網上找答案,要先將自己的程序調試一下,將錯誤信息打印出來,然后針對錯誤信息有針對性的去網上找答案。這樣做比較有效。
自己結論:
java 代碼中調用cmd 命令執行 mysql 腳本結果 cmd 命令返回結果為1的問題:
Process process = Runtime.getRuntime().exec(cmd);
int waitFor = process.waitFor();
上邊waitFor值為1,而值為0才是執行正常,那我怎么才能知道這個執行結果是因為什么出錯的呢?可以把出錯信息打印出來就行了,process對象 有一個異常流,打印一下就好了:
FileInputStream errorStream = (FileInputStream)process.getErrorStream(); InputStreamReader isr = new InputStreamReader(errorStream,"gbk");//讀取 System.out.println(isr.getEncoding()); BufferedReader bufr = new BufferedReader(isr);//緩沖 String line = null; while((line =bufr.readLine())!=null) { System.out.println(line); } isr.close();
結果發現打印的語句是:mysqldump 不是內部命令...
可以發現 執行結果不正確是因為 這個mysql的命令 沒法使用造成的,去找這個原因就可以了。
這個問題明顯是mysql的環境變量中path路徑沒配mysql路徑,但由於mysql軟件安裝時系統是默認配的,為啥這里還是不能用mysql命令,而c盤根目錄卻可以用的,最后查原因是需要重啟電腦,intellj 中才能使用剛裝的mysql服務。