Java Security类可防止您使用exit(0)终止代码!在HackerRank中

有人可以解释一下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)终止代码!

iCMS 回答:Java Security类可防止您使用exit(0)终止代码!在HackerRank中

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

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

那么,这是怎么回事:

  1. 用户程序调用{​​{1}}
  2. System.exit(...)方法询问安全管理器是否允许System.exit(...)权限
  3. 自定义安全管理器抛出exitVM
  4. ExitTrappedException不会继续停止JVM,但会在调用方上传递异常。 JVM继续运行
本文链接:https://www.f2er.com/2006013.html

大家都在问