2012-02-21 67 views
0

我们正在开发java applet并将其嵌入到我们的网页中。当applet通过HTML APPLET标签加载时,浏览器/ JVM提示用户允许它运行。当我们打到取消,Java控制台显示以下异常:Handle Applet抛出java.lang.ExceptionInInitializerError阻止它运行

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试图加载加载被阻止,因此抛出异常,但是我们怎么样优雅地处理浏览器中的这种情况?我想检测该applet是否被拒绝并对该条件发布合理的响应,但是我并不知道如何捕获此异常,因为它似乎是由JVM引发的,因为它没有将jar文件负载而不是代码写在它...

想法?

谢谢!

+0

'downLoadApp.java'请了解常见的Java命名和坚持使用它。这应该被大写为'DownLoadApp.java' – 2012-02-21 16:18:14

回答

3

您可以通过将调用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? 
    } 
} 
+0

给你“最接近的答案”...变量被全局声明,而不是每次使用它,因此导致这个崩溃,它不可能是尝试/捕获。我们将它加载到每个使用它的函数中,以便我们可以尝试/捕获它,现在它被成功捕获,并且applet不会崩溃并挂起整个浏览器! – Rimer 2012-02-24 22:21:18

+0

“全局声明”你的意思是像一个类中的静态变量吗? – Joni 2012-02-24 23:56:18

-1

我不认为你可以捕获这个异常,因为这是由JVM在加载小程序时引发的。

+0

那么,我很困惑,因为当这种情况发生时,整个浏览器都是HANG挂钩的插件容器进程,这个异常死了...不应该BROWSER处理这个例外?这是一个FF错误? – Rimer 2012-02-24 17:34:07

+0

此外,关于Java小程序的最奇怪的事情之一是,即使您不允许它们运行,它们似乎仍然运行,它们只是以有限的权限运行......所以很奇怪 – Rimer 2012-02-24 22:24:05

2

您是否在downLoadApp类的静态环境中的某处呼叫System.getenv("TEMP")?很可能这是在静态字段的初始化器中,但它可能在静态代码块中。

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

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

+0

这或多或少是个问题。 Joni提供了代码示例,所以我把它给了他/她:) – Rimer 2012-02-24 22:22:58

相关问题