2012-02-09 3 views
3

私はJavaがインストールされていないときでも、どのシステムでも実行できるように、JRE(Windows、Mac OSX、Linuxごとに1つ)と一緒にUSBスティックにJavaアプリケーションを持っています。私は、USBスティックが取り外されたかどうかを検出するスレッドを実行していて、それがアプリケーションを終了しているかどうかを検出します。JavaランタイムがリムーバブルドライブにあるときにNoClassDefFoundErrorを防止する方法は?

終了する前にメッセージを表示したい(またはドライブを再挿入するように伝えたい)が、JOptionPaneを表示しようとすると、JREがUSBとともに削除されたため、NoClassDefFoundErrorが返されます。

Javaが存在しなくなったファイルシステムからそれらをロードしようとしないように、必要なクラスをメモリに保持する方法はありますか?

ありがとうございます!

答えて

3

ほとんどのランタイムでは、にロードされるクラスは、JavaのメモリのPermGenセクションにあるRAMになります。になります。

エラーが表示されるのは、以前ロードされていないクラスが必要になることです。これは、もはや存在しないドライブでのみ使用できます。

プログラムの起動時にエラーを表示するロジックをトリガすることで回避できますが、目に見えないモードで表示される点が異なります。これは、すべての必要なクラスがロードされるように同じコードパスを実行し、エラーを表示する必要があるときにそれらがすでにわかっていることを確認する必要があります。これが難しい場合は、手動でClass.forName("javax.swing.JOptionPane")(代わりに各クラスが必要)を手動で呼び出すことができます。ハードコードされたクラスを更新せずにレンダリングコードを変更すると、より壊れやすくなります。

ではない場合(つまり、すべての必要なクラスが以前にロードされていて、それでも問題がある場合)、ランタイムは明らかにクラスをアンロードしています。ここで何がやっているのか、それを止める方法については、ドキュメントを参照する必要があります。

関連する問題