句柄Applet抛出java.lang.ExceptionInInitializerError阻止其运行

句柄Applet抛出java.lang.ExceptionInInitializerError阻止其运行,java,applet,Java,Applet,我们正在开发JavaApplet并将其嵌入到我们的网页中。通过HTML小程序标记加载小程序时,浏览器/JVM会提示用户允许其运行。当我们点击cancel时,java控制台显示以下异常: java.lang.RuntimeException: java.lang.ExceptionInInitializerError at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source) at sun.plugin2.ap

我们正在开发JavaApplet并将其嵌入到我们的网页中。通过HTML小程序标记加载小程序时,浏览器/JVM会提示用户允许其运行。当我们点击cancel时,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.lang.RuntimeException:java.lang.ExceptionInInitializerError
位于sun.plugin2.applet.Plugin2Manager.createApplet(未知源)
位于sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(未知源)
位于java.lang.Thread.run(未知源)
原因:java.lang.ExceptionInInitializeError
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(未知源)
位于sun.reflect.delegatingConstructor或AccessorImpl.newInstance(未知源)
位于java.lang.reflect.Constructor.newInstance(未知源)
位于java.lang.Class.newInstance0(未知源)
位于java.lang.Class.newInstance(未知源)
位于sun.plugin2.applet.Plugin2Manager$12.run(未知来源)
在java.awt.event.InvocationEvent.dispatch(未知源)处
位于java.awt.EventQueue.dispatchEventImpl(未知源)
位于java.awt.EventQueue.access$000(未知源)
在java.awt.EventQueue$1.run处(未知源)
在java.awt.EventQueue$1.run处(未知源)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.security.AccessControlContext$1.doIntersectionPrivilege(未知源)
位于java.awt.EventQueue.dispatchEvent(未知源)
位于java.awt.EventDispatchThread.pumpOneEventForFilters(未知源)
位于java.awt.EventDispatchThread.pumpEventsForFilter(未知源)
位于java.awt.EventDispatchThread.pumpEventsForHierarchy(未知源)
位于java.awt.EventDispatchThread.pumpEvents(未知源)
位于java.awt.EventDispatchThread.pumpEvents(未知源)
位于java.awt.EventDispatchThread.run(未知源)
原因:java.security.AccessControlException:拒绝访问(java.lang.RuntimePermission getenv.TEMP)
位于java.security.AccessControlContext.checkPermission(未知源)
位于java.security.AccessController.checkPermission(未知源)
位于java.lang.SecurityManager.checkPermission(未知源)
位于java.lang.System.getenv(未知源)
在downLoadApp.(downLoadApp.java:15)
... 还有21个
异常:java.lang.RuntimeException:java.lang.ExceptionInInitializeError
现在,我意识到这很可能是因为java试图加载的类被阻止加载,因此引发了异常,但是我们如何在浏览器中优雅地处理这种情况呢?我想检测小程序是否被拒绝,并对该条件做出合理的响应,但我不知道如何捕获此异常,因为它似乎是JVM为了响应没有加载jar文件而抛出的,而不是在其中编写的代码

想法


谢谢

我认为您无法捕获此异常,因为这是JVM在加载小程序时抛出的

我认为您无法捕获此异常,因为这是JVM在加载小程序时抛出的

是否在
downLoadApp
类的静态上下文中调用
System.getenv(“TEMP”)
?这很可能是在静态字段的初始值设定项中,但也可能是在静态代码块中

这就是它失败的地方(抛出
java.security.AccessControlException
)。堆栈跟踪的其余部分是由此产生的错误。您需要捕获此异常以检测您没有适当的权限


由于无法捕获静态字段初始值设定项的异常,因此需要将对
getenv
的调用移动到方法或静态代码块中。

是否在
downLoadApp
类的静态上下文中的某个地方调用
System.getenv(“TEMP”)
?这很可能是在静态字段的初始值设定项中,但也可能是在静态代码块中

这就是它失败的地方(抛出
java.security.AccessControlException
)。堆栈跟踪的其余部分是由此产生的错误。您需要捕获此异常以检测您没有适当的权限


由于无法捕获静态字段初始值设定项的异常,您需要将对
getenv
的调用移动到一个方法或静态代码块中。

您可以通过在try-catch语句的
downLoadApp.java
第15行中调用
System.getenv
来捕获访问控制异常。也就是说,与此相反:

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?
    }
}

您可以通过在try-catch语句的
downLoadApp.java
第15行中调用
System.getenv
来捕获访问控制异常。也就是说,与此相反:

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?
    }
}

downLoadApp.java
请学习常见的java术语并一致使用。这应该大写为
DownLoadApp.java
DownLoadApp.java
请学习常见的java术语并一致使用。这应该大写为
DownLoadApp.java
好吧,我很困惑,因为当这种情况发生时,整个浏览器都被挂起的插件容器进程挂起,而这个进程在这个例外情况下是死的。。。浏览器不应该处理这个异常吗?这是一个FF错误吗?此外,Java小程序最奇怪的一点是,即使您不允许它们运行,它们也似乎在有限的权限下运行。。。奇怪的是,我当时很困惑,因为当这种情况发生时,整个浏览器都被挂起的插件容器进程挂起了,而这个进程在这个例外情况下就死了。。。浏览器不应该处理这个异常吗?这是一个FF错误吗?此外,Java小程序最奇怪的一点是,即使您不允许它们运行,它们也似乎在有限的权限下运行。。。真奇怪