【问题标题】:If the current thread has the authority to exit Java virtual machine如果当前线程有权限退出Java虚拟机
【发布时间】:2016-03-01 03:06:20
【问题描述】:

我正在尝试课程SecurityManager。我想检查当前线程是否有权限退出Java虚拟机。下面是我想出的代码。

SecurityManager appsm = System.getSecurityManager();
System.out.println("something");
appsm.checkExit(0);

我期待SecurityManager.checkExit 抛出SecurityException。但是,IDE 改为输出 NullPointerException

Exception in thread "main" java.lang.NullPointerException
    at jtotheplatformenvironment.JTOThePlatformEnvironment.main(JTOThePlatformEnvironment.java:40)
C:\Users\Justin\AppData\Local\NetBeans\Cache\8.1\executor-snippets\run.xml:53: Java returned: 1

为什么会这样?

【问题讨论】:

  • java 默认情况下不使用 SecurityManager 运行,因此您将获得 NPE。您必须在启用 SecurityManager 的情况下启动您的程序。
  • @非常感谢您的建议!如何在程序开始时启用 SecurityManager?

标签: java multithreading securitymanager


【解决方案1】:

您需要使用额外的参数来执行 Java 应用程序:

-Djava.security.manager

因此 JVM 将使用内置的默认安全管理器 (source) 启动,否则不会创建安全管理器,这就是您获得 NPE 的原因。

【讨论】:

    【解决方案2】:

    根据 oracle documentation,您可以通过在 System 类中使用以下 API 来设置 SecurityManager

    public static void setSecurityManager(SecurityManager s)
    

    设置系统安全性。

    如果已经安装了安全管理器,此方法首先调用安全管理器的 checkPermission 方法,并带有 RuntimePermission("setSecurityManager") 权限,以确保可以替换现有的安全管理器。这可能会导致抛出 SecurityException。

    否则,参数被建立为当前的安全管理器。如果参数为 null 并且没有建立安全管理器,则不采取任何操作,方法只是返回。

    【讨论】:

      猜你喜欢
      • 2018-11-25
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 2015-10-23
      相关资源
      最近更新 更多