我正在尝试课程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
为什么会这样?
答案 0 :(得分:2)
您需要使用额外的参数执行Java应用程序:
-Djava.security.manager
因此,JVM将使用内置的默认安全管理器(source)启动,否则不会创建安全管理器,这就是您获得NPE的原因。
答案 1 :(得分:0)
根据oracle documentation,您可以在SecurityManager
类
System
public static void setSecurityManager(SecurityManager s)
设置系统安全性。
如果已经安装了安全管理器,则此方法首先使用RuntimePermission(" setSecurityManager")权限调用安全管理器的checkPermission方法,以确保可以替换安全管理器现有安全经理。这可能会导致抛出SecurityException。
否则,该参数将建立为当前安全管理器。如果参数为null且没有建立安全管理器,则不执行任何操作,该方法只返回。