4

ClassFormatErrorを取得しているクライアントを支援しようとしています。エラーメッセージには

bytecode array size > 65535 at offset=66370 

スタックトレースは、ユーティリティクラスで静的メソッドを呼び出そうとしたときにエラーが発生したことを示しています。自分のシステムではエラーを再現できません。

問題をグーグルで検索してみて(search = classformaterror "bytecode array size"、引用符を含む)、他のソフトウェアのバグレポートを見つけましたが、何も役に立ちませんでした。ここでも検索してみましたが、この特定のエラーメッセージに関連する結果が見つかりませんでした。(たぶん私はそれらを見つけることができませんでした...)

この問題の原因は何ですか?独自仕様であるため、コードや実際のスタックトレースを投稿できません。

どこを見ればよいか教えてくれるポインタを事前に感謝します。

4

3 に答える 3

4

Jon Skeet の応答をさらに詳しく説明するには、次のようにします。

クラス ファイルの形式では、各メソッドのバイトコード配列に対して 4 バイトの長さのフィールドが指定されていますが、実際には、特定の構造 (ローカル変数テーブル、行番号テーブル、および例外テーブル) ではこれが 65535 に制限されています。

最初の 2 つはオプションであり、デバッグ情報なしでクラスをコンパイルする場合はコンパイルされませんが、3 つ目は必須です。もちろん、メソッドの後半部分に例外処理がなければ、コンパイラはそれに気付かないかもしれません。さらに悪いことに、オーバーフローして、破損した try-catch ブロックをコンパイルする可能性があります。

いずれにせよ、ユーティリティ クラスの 1 つまたは複数のメソッドが大きすぎるため、ハードコーディングされた長さの制限がなくても、おそらく分割する必要があります。

更新: もちろん、コード検証ツールの説明では、コードの長さは明示的に 65536 バイトに制限されています。しかし、必然的に、それをよりガイドラインとして扱う実装がそこにあるでしょう。:)

于 2012-08-07T17:35:02.913 に答える
2

これは、ユーティリティ クラス メソッドが基本的に大きすぎて、分割する必要があることを示唆しています。コンパイラが異なれば、出力されるコードの量も異なります。また、VM が異なれば、制約が多かれ少なかれ厳密に適用される可能性もあると思います。

さらに、デバッグ情報なしでユーティリティ クラスをコンパイルすると、制限を下回るメソッドが取得される場合ありますが、単に分割する方がよいでしょう。

于 2012-08-07T17:22:43.413 に答える