アプレットを実行すると
java.lang.ClassFormatError
がスローされる
症状アプレットを Sun JVM を使用したブラウザで実行している場合、
ClassFormatError
がClassLoader
でスローされます。同じアプレットが Microsoft VM では実行できます。原因
このエラーは、古い JDK 1.0.2 か 1.1 コンパイラ、またはサードパーティのオブファスケータによって生成されたバイトコードが原因で発生します。これまで、該当するコンパイラやオブファスケータによって多くのバイトコードが生成されていますが、いずれも Java VM 仕様に準拠していません。最近の J2SE リリースのべリファイアは不正なクラスフォーマットに関して非常に厳しくなっているため、こうした不正なクラスファイルがロードされたら VM によって
ClassFormatError
がスローされます。古いクラスファイルに関する典型的な問題点は以下のとおりです (ただしすべてを網羅したものではない)。
- クラスファイルの最後に余分なバイトが存在する
- クラスファイルに、文字で始まらないメソッド名やフィールド名が含まれている
- クラスが別のクラスの private メンバにアクセスしようとする
- クラスファイルに、不正な定数プールインデックスや不正な UTF-8 文字列など、その他の形式エラーが存在する
- 以前の (サードパーティの) バイトコードのオブファスケータによって生成されたクラスファイルが、適切なクラスファイル形式に違反している
解決方法
不正なクラスファイルをもついくつかのアプレットを Java 2 プラットフォームで実行できるようにするために、Java Plug-in には、不正なクラスファイルを正しいものに変換するバイトコード変換プログラムが含まれています。現時点では、以下の問題を持つ不正なクラスファイルだけが変換されます。
- ローカルの変数名に不正な定数プールインデックスが存在する
- クラスファイルの最後に余分なバイトが存在する
- コードセグメントの長さが誤っている
- 不正なフィールド/メソッド名
- 不正なフィールド/メソッド修飾子
- ローカル var テーブルにおける不正な start_pc/length
しかし、バイトコード変換プログラムでは、以下の問題を変換できません。そのため、依然として
ClassFormatError
が発生します。
- 非仮想関数呼び出しの不正な使用
- 引数がローカルに適合できない
- ルックアップスイッチがソートされない
- クラスファイルの切り捨て
これらの問題は、JDK にある
javac
コンパイラを使用して Java クラスを再コンパイルするだけで解決します。サードパーティのオブファスケータを使用する場合は、それが正しいクラスファイル形式に準拠したクラスファイルを作成するかどうかを確認してください。詳細情報
なし