如何防止调用System.exit()终止JVM?

时间:2011-04-05 09:20:41

标签: java

我几乎可以肯定这是不可能的,但值得一试。

我正在为某个工具编写命令行界面。我在谈论一个调用另一个Java应用程序的Java应用程序。该工具在执行后调用System.exit,这反过来终止了我自己的执行环境。我不希望这样。

有没有办法忽略System.exit次来电?

4 个答案:

答案 0 :(得分:18)

是的,这可以使用SecurityManager。请尝试以下

class MySecurityManager extends SecurityManager {
  @Override public void checkExit(int status) {
    throw new SecurityException();
  }

  @Override public void checkPermission(Permission perm) {
      // Allow other activities by default
  }
}

在课堂上使用以下电话:

myMethod() {
    //Before running the external Command
    MySecurityManager secManager = new MySecurityManager();
    System.setSecurityManager(secManager);

    try {
       invokeExternal();
    } catch (SecurityException e) {
       //Do something if the external code used System.exit()
    }
}

答案 1 :(得分:2)

SecurityManager设置为忽略System.exit(),除非它来自您的代码。

答案 2 :(得分:2)

您可以将应用程序分为两部分。第一个由工具启动。然后,将应用程序的第二部分作为新进程启动。然后主机应用程序终止你的第一部分,但第二部分仍在运行。

这样,你的应用程序的第一部分就是第二部分的启动,而第二部分又是你真正的应用程序。

答案 3 :(得分:1)

关于this (@Vonc answer),您应该使用安全管理器:

  

尝试修改TestCase以运行   一个阻止的安全管理器   调用System.exit,然后捕获   SecurityException异常。