如果当前线程有权限退出Java虚拟机

If the current thread has the authority to exit Java virtual machine

我正在尝试 class 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.1\executor-snippets\run.xml:53: Java returned: 1

为什么会这样?

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

-Djava.security.manager

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

根据 oracle documentation,您可以使用下面的 API in System class

设置 SecurityManager
public static void setSecurityManager(SecurityManager s)

Sets the System security.

If there is a security manager already installed, this method first calls the security manager's checkPermission method with a RuntimePermission("setSecurityManager") permission to ensure it's ok to replace the existing security manager. This may result in throwing a SecurityException.

否则,参数被确立为当前的安全管理器。如果参数为 null 且未建立安全管理器,则不采取任何操作,方法只是 returns.