ClassLoader によって java.lang.ClassFormatError がスローされる


症状

Sun JavaTM Runtime Environment (JRETM) を使ってブラウザ内でアプレットを実行すると、ClassLoader によって java.lang.ClassFormatError がスローされます。同じアプレットが Microsoft  Virtual Machine (VM) では実行できます。

原因

このエラーは、古い JDK 1.0.2 か 1.1 コンパイラ、またはサードパーティーのオブファスケータによって生成されたバイトコードが原因で発生します。これまで、該当するコンパイラやオブファスケータによって多くのバイトコードが生成されていますが、いずれも Sun JRE 仕様に準拠していません。最近の Java SE リリースのべリファイアは不正なクラスフォーマットに関して非常に厳しくなっているため、こうした不正なクラスファイルがロードされたら VM によって java.lang.ClassFormatError がスローされます。

古いクラスファイルに関する典型的な問題点は以下のとおりです (ただしすべてを網羅したものではない)。

解決方法

不正なクラスファイルを持ついくつかのアプレットを Java プラットフォームで実行できるようにするために、Java Plug-in には、不正なクラスファイルを正しいものに変換するバイトコード変換プログラムが含まれています。現時点では、以下の問題を持つ不正なクラスファイルだけが変換されます。

しかし、バイトコード変換プログラムでは、以下の問題を変換できません。 そのため、依然として ClassFormatError が発生します。

これらの問題は、JDK にある javac コンパイラを使用して Java クラスを再コンパイルするだけで解決します。サードパーティーのオブファスケータを使用する場合は、それが正しいクラスファイル形式に準拠したクラスファイルを作成するかどうかを確認してください。

詳細情報

        なし。