2012-12-10 27 views
1

請考慮以下從Eclipse運行的代碼片段。運行不存在的jar不會導致任何期望/錯誤

即使外部jar文件不存在,也不會拋出異常並且process不爲空。 這是爲什麼?

try { 
    Process process = Runtime.getRuntime().exec("java -jar NonExisting.jar"); 

    if (process == null) 
      System.out.println("process = null"); 
    else 
     System.out.println(process); 
    } catch (IOException e) { 
     System.err.println(e); 
} 

它打印

[email protected] 

如果我命令行manully運行它,然後有一個錯誤:創建和成品

C:\Users\workspace\Project\src>java -jar NonExisting.jar 
Error: Unable to access jarfile NonExisting.jar 
+1

因爲java進程正在運行/執行。如果您嘗試運行不存在的可執行文件,則會出現錯誤。你必須檢查java.exe **退出代碼**。 –

+0

作爲一般性提示,請按照鏈接從[exec info]鏈接到JavaWorld文章。頁面](http://stackoverflow.com/tags/runtime.exec/info)並按照**所有**的建議。如果該守則已經這樣做,結果將會更加清晰。另外,除非您打算支持1.4,否則使用'ProcessBuilder'來創建'Process'並將'String'參數分隔成一個'String []'。 –

回答

2

Process.waitFor()爲您提供了衍生進程的退出代碼,並可能返回一個非零值(即錯誤)值。您應該檢查此值,並同時收集stdout/err(有關更多信息,請參見here)。 stderr可能會報告錯誤。

您目前所做的只是確認該流程已被調用。然後該進程嘗試/未能加載該jar文件,並且該文件存在並報告錯誤。

+0

爲什麼'waitFor'和'exitValue'聲明爲抽象?我可以真的叫它嗎? –

+0

你可以。返回的Process類是抽象的,你會得到一個派生實現,它提供了這些方法。 –

+0

該操作系統的本地實現?如何獲得關於返回對象的更多信息,而不是它擴展了Process? –

1

的過程。您應該檢查Process對象的返回值。如果新流程的創建出現問題,則會拋出異常,所以在這裏您不會遇到異常。

+0

是的,如果jar不存在,則'exitValue()'返回1。但現在我測試了現有的jar和'exitValue()'拋出'java.lang.IllegalThreadStateException:進程沒有退出' –

相關問題