1

请考虑以下从 Eclipse 运行的代码段。

即使外部 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);
}

它打印

java.lang.ProcessImpl@1a4d139

如果我从命令行手动运行它,则会出现错误:

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

3 回答 3

2

Process.waitFor()为您提供生成进程的退出代码,并且可能返回非零(即错误)值。您应该检查此值,并同时收集stdout/ err(有关更多信息,请参见此处)。stderr很可能会报错。

您当前所做的只是确认该过程已被调用。然后该进程尝试/失败加载 jar 文件,此时它存在并报告错误。

于 2012-12-10T11:02:23.767 回答
1

该过程已创建并完成。您应该检查对象的返回值Process。如果新进程的创建有问题会抛出异常,所以这里不会出现异常。

于 2012-12-10T11:01:07.777 回答
1

哇,这很丑:-) 你为什么不在新线程中启动 jar 的主要方法?那么你应该检查进程的退出状态:

http://en.wikipedia.org/wiki/Exit_status

http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Process.htm

您基本上是在分叉该进程,因此您无法从中获取异常或任何特定于 java 的内容,您需要处理新进程,就像任何其他特定于操作系统的应用程序一样。

于 2012-12-10T11:01:27.700 回答