Если текущий поток имеет полномочия на выход из виртуальной машины 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.

В противном случае аргумент устанавливается как текущий менеджер безопасности. Если аргумент нулевой и менеджер безопасности не установлен, то никаких действий не предпринимается, и метод просто возвращается.

Другие вопросы по тегам