2

谁能解释一下 HackerRank 的代码?

class DoNotTerminate {

    public static class ExitTrappedException extends SecurityException {    
        private static final long serialVersionUID = 1;
    }

    public static void forbidExit() {
       final SecurityManager securityManager = new SecurityManager() {
           @Override
           public void checkPermission(Permission permission) {
              if (permission.getName().contains("exitVM")) {
                  throw new ExitTrappedException();
              }
           }
       };
       System.setSecurityManager(securityManager);
    }
}

以下代码将阻止您使用 exit(0) 终止代码!

4

1 回答 1

3

当程序试图通过调用来停止 JVM 时System.exit(...),它首先通过询问安全管理器是否授予权限来检查是否允许此操作exitVM

您发布的代码将安全管理器替换为自定义安全管理器,该管理器ExitTrappedException在检查exitVM权限时会抛出异常。

所以,发生的事情是这样的:

  1. 用户程序调用System.exit(...)
  2. System.exit(...)方法询问安全管理器是否exitVM允许权限
  3. 自定义安全管理器抛出一个ExitTrappedException
  4. System.exit(...)不继续停止JVM,而是将异常传递给调用者;JVM 继续运行
于 2020-07-03T13:19:32.513 回答