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

时间:2016-03-01 03:06:21

标签: java multithreading securitymanager

我正在尝试课程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

为什么会这样?

2 个答案:

答案 0 :(得分:2)

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

-Djava.security.manager

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

答案 1 :(得分:0)

根据oracle documentation,您可以在SecurityManager

中使用以下API设置System
public static void setSecurityManager(SecurityManager s)
  

设置系统安全性。

     

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

否则,该参数将建立为当前安全管理器。如果参数为null且没有建立安全管理器,则不执行任何操作,该方法只返回。