Если текущий поток имеет полномочия на выход из виртуальной машины Java
Я пробую класс 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 ответа
Вам необходимо выполнить приложение Java с дополнительным параметром:
-Djava.security.manager
Таким образом, JVM будет запущена со встроенным менеджером безопасности по умолчанию ( источник), иначе менеджер безопасности не будет создан, и поэтому вы получаете NPE.
Согласно документации оракула, вы можете установить SecurityManager
используя ниже API в System
учебный класс
public static void setSecurityManager(SecurityManager s)
Устанавливает безопасность системы.
Если диспетчер безопасности уже установлен, этот метод сначала вызывает метод checkPermission диспетчера безопасности с разрешением RuntimePermission("setSecurityManager"), чтобы убедиться, что можно заменить существующий диспетчер безопасности. Это может привести к выбрасыванию SecurityException.
В противном случае аргумент устанавливается как текущий менеджер безопасности. Если аргумент нулевой и менеджер безопасности не установлен, то никаких действий не предпринимается, и метод просто возвращается.