【问题标题】:How to prevent calls to System.exit() from terminating the JVM?如何防止对 System.exit() 的调用终止 JVM?
【发布时间】:2011-07-29 19:33:00
【问题描述】:

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

我正在为某个工具编写命令行界面。我说的是调用另一个 Java 应用程序的 Java 应用程序。该工具在执行后调用System.exit,进而终止我自己的执行环境。我不想那样。

有什么方法可以忽略System.exit 的来电?

【问题讨论】:

标签: java


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      是的,这可以使用 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()
          }
      }
      

      【讨论】:

      • 我建议也重写 SecurityManager 的checkPermission 方法以避免与其他特权操作相关的安全异常。
      • @theomega 我使用了你的代码,但现在我要读取的每个文件都被拒绝访问
      • @EmmanuelBourg 我在答案中使用了代码,但现在我要读取的每个文件都出现“访问被拒绝”错误
      • 可能通常正确的解决方案是获取以前的安全管理器,如果存在,则将所有其他方法委托给它。
      【解决方案4】:

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

      尝试修改 TestCase 以运行 防止 调用 System.exit,然后捕获 安全异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-21
        • 2012-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-14
        • 1970-01-01
        相关资源
        最近更新 更多