Обработайте апплет, бросающий java.lang.ExceptionInInitializerError, препятствующий его запуску - PullRequest
0 голосов
/ 21 февраля 2012

Мы разрабатываем Java-апплет и встраиваем его в наши веб-страницы.Когда апплет загружается через теги HTML APPLET, браузер / JVM предлагает пользователю разрешить его запуск.Когда мы нажимаем отмену, консоль java указывает на следующее исключение:

java.lang.RuntimeException: java.lang.ExceptionInInitializerError
    at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ExceptionInInitializerError
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at java.lang.Class.newInstance0(Unknown Source)
    at java.lang.Class.newInstance(Unknown Source)
    at sun.plugin2.applet.Plugin2Manager$12.run(Unknown Source)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$000(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.awt.EventQueue$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission getenv.TEMP)
    at java.security.AccessControlContext.checkPermission(Unknown Source)
    at java.security.AccessController.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPermission(Unknown Source)
    at java.lang.System.getenv(Unknown Source)
    at downLoadApp.<clinit>(downLoadApp.java:15)
    ... 21 more
Exception: java.lang.RuntimeException: java.lang.ExceptionInInitializerError

Теперь я понимаю, что это наиболее вероятно, потому что класс, который пытался загрузить java, был заблокирован для загрузки, и, следовательно, генерируется исключение, но какмы изящно справимся с этой ситуацией в браузере?Я хотел бы обнаружить, что апплет был отклонен, и опубликовать разумный ответ на условие, но я не знаю, как перехватить это исключение, так как оно, похоже, было выдано JVM в ответ на то, что файл jar не был переданзагрузить, а не код, написанный в нем ...

Идеи?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 21 февраля 2012

Вы можете перехватить исключение управления доступом, поместив вызов System.getenv в downLoadApp.java строке 15 в инструкции try-catch. То есть вместо этого:

static String tmp = System.getenv("TEMP");

вы должны иметь:

static String tmp;

static {
    try {
        tmp = System.getenv("TEMP");
    } catch (java.security.AccessControlException ace) {
        // tmp is not set, maybe use some default value?
    }
}
2 голосов
/ 21 февраля 2012

Вы называете System.getenv("TEMP") где-нибудь в статическом контексте класса downLoadApp? Скорее всего, это в инициализаторе статического поля, но это может быть в статическом блоке кода.

Это место, где оно терпит неудачу (выбрасывается java.security.AccessControlException). Остальная часть трассировки стека - ошибки, вытекающие из этого. Вам нужно перехватить это исключение, чтобы обнаружить, что у вас нет соответствующих разрешений.

Поскольку вы не можете перехватывать исключения инициализаторов статических полей, вам необходимо переместить вызов на getenv в метод или блок статического кода.

0 голосов
/ 21 февраля 2012

Я не думаю, что вы можете поймать это исключение, поскольку оно генерируется JVM при загрузке апплета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...