调用Java主函数

时间:2010-03-22 16:05:42

标签: java exception

我试图调用另一个JAR的主要功能。现在,这个main函数包含在try和catch块下。

但是当主调用返回“NullPointerException”时,程序只是崩溃而不是捕获它。

所以,例如

try {
    somelibary.main()
}
catch (Exception e) {
    System.out.println("Exception Caught");
}

此代码从main()捕获NullPointerException。 有谁知道y的原因?

4 个答案:

答案 0 :(得分:5)

其他主要功能可能正在进行自己的错误处理,àla

public static void main(String[] args) {
    try {
        ....
    } catch (Exception e) {
        e.printStackTrace();
        System.exit(0);
    }
}

如果这是另一个主要功能正在做的事情,那么你将无法捕捉到它的异常。你有这个主要功能的代码吗?

答案 1 :(得分:5)

如图所示,您的代码肯定会捕获somelibrary.main()抛出的NullPointerException。如果应用程序由于NullPointerException而无论如何都会停止,那么某些库有可能会捕获异常,转储堆栈跟踪并调用system.exit()

在这种情况下,问题不是如何捕获NPE,而是如何防止System.exit()实际退出。

当然,可以在StackOverflow上找到该问题的答案,right here。只需在调用someLibrary之前安装SecurityManager,然后重置securityManager。

答案 2 :(得分:0)

使用您显示的代码,您还将捕获NullPointerException。但执行将在catch-block之后继续。因此在这种情况下停止执行somelibary.main()。如果你的main()不包含更多代码,程序将在捕获异常后结束。这就是可能发生的事情。您可以发布主要的完整代码,以验证这一点。

添加:您想知道如何继续执行该程序。但在这种情况下,somelibrary.main()通过抛出异常来停止。 main类中唯一的选项是循环,重新执行somelibrary.main()。另一种可能性是在更高级别(主输入循环)捕获异常,您可以忽略该问题并继续执行代码。正如你所说,你执行另一个jar-main我怀疑你不能改变另一个jar的代码。所以你只剩下重新执行另一个主要的:

boolean ended = false;
while (!ended)
{
  try {
      somelibary.main()
      ended = true;
  }
  catch (Exception e) {
      System.out.println("Exception Caught");
  }
}

此代码在异常时重新启动另一个main,但如果另一个main正常结束则结束。

答案 3 :(得分:0)

也许您可以使用Runtime.exec在另一个进程中执行main方法,然后从out / err流中捕获结果或错误。