2012-02-21 72 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