2012-02-21 7 views
0

私たちはJavaアプレットを開発し、Webページに埋め込みます。アプレットがHTMLのAPPLETタグを介してロードされると、ブラウザ/ JVMはユーザに実行を許可するように指示します。私たちはキャンセルヒットすると、Javaコンソールには次の例外を示します。Handle Applet throwing 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ロードしようとしたので、それが最も可能性があります実現をロードすることを防止し、したがって、例外がスローされますが、どのように私たちはブラウザでこの状況を正常に処理しますか?アプレットが拒否されたことを検出して条件に合理的な応答を投稿したいと思いますが、この例外を捕捉する方法はわかりません。なぜならJVMがJARファイルを取得しないという反応にスローされたようです読み込まれたコードではなく読み込み...

アイデア?

ありがとうございます!

+0

'downLoadApp.java'は、一般的なJavaの命名法を学び、それを一貫して使用してください。これは、 'DownLoadApp.java'として大文字にする必要があります –

答えて

3

System.getenvへのコールをtry-catchステートメントのdownLoadApp.java行15に置くことで、アクセス制御例外をキャッチできます。それは、これに代えて、次のとおりです。

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

"最も近い答え"を...変数は、使用されるたびに個別にではなくグローバルに宣言されていました。試してみてください。私たちは代わりにそれを使用する各関数にロードしましたので、試してみることができました。これでキャッチされ、アプレットはクラッシュせず、ブラウザ全体をハングアップしません! – Rimer

+0

「グローバルに宣言された」とは、クラス内の静的変数のような意味ですか? – Joni

-1

アプレットをロードするときにJVMによってスローされるため、この例外をキャッチすることはできません。

+0

これは混乱しています。なぜなら、この例外が発生すると、ブラウザー全体がこの例外で死んでいるぶら下がりのプラグインコンテナプロセスによってHUNGになっているからです.BROWSERハンドルこの例外?それはFFのバグですか? – Rimer

+0

さらに、Javaアプレットに関する最も奇妙なことの1つは、許可しなくても実行されているように見えます。ちょっと変わったアクセス許可で実行されています...だから変わって – Rimer

2

downLoadAppクラスの静的コンテキストのどこかでSystem.getenv("TEMP")と呼んでいますか?おそらくこれは静的フィールドの初期化子にありますが、静的コードブロック内にある可能性があります。

これは失敗する場所です(java.security.AccessControlExceptionがスローされます)。残りのスタックトレースはそれに続くエラーです。適切な権限を持っていないことを検出するには、この例外をキャッチする必要があります。

静的フィールドイニシャライザの例外をキャッチできないため、getenvへの呼び出しをメソッドまたは静的コードブロックに移動する必要があります。

+0

これは多かれ少なかれ問題です。 Joniはコードサンプルを入れましたので、私は彼/彼女にそれを渡しました:) – Rimer

関連する問題