最近、プロジェクトを 1.7 から Java 1.8 にアップグレードしました。
クラスの 1 つでメソッドの一貫性のないスタックマップの例外が発生します。
メソッドで割り当てられていないローカル変数を初期化することで解決しましたが、Java 8 で未読変数を使用すると例外が発生する理由を説明してください。
使用している eclipse バージョン (Kepler SR 2 20140224-0627) に関連している可能性があります。
回避策
障害のあるコードを修正する前に、以前は「--xxSplitVerifier」(1.7) または「-noVerify」Jvm 引数を使用していました。
Eclipseワークスペースのコンパイラ設定が「未使用のローカル変数を保持する」オプションでチェックされていない場合、Java 8で正常にコンパイルされます
方法:
私が一緒にいる会社の非常に大きくて抑制されたコードとして、完全な方法を投稿することはできません。
public synchronized int setData() //sample code
{
int id= 0;
StringBuffer sb; // works if initialized - stringBuffer sb = null;
String name; // works if name = null
if (true) {
sb = new StringBuffer();
} else {
sb = new StringBuffer();
}
スタックフレーム:
原因: java.lang.VerifyError: ブランチ ターゲット 2079 で一貫性のないスタックマップ フレーム
例外の詳細: 場所: someClass.setData(someClass/Data)I @2079: iload_3
理由: タイプ top (現在のフレーム、locals[4])は'java/lang/StringBuffer' (スタック マップ、locals[4]) に 割り当てられません。
現在のフレーム: bci: @98 flags: { } locals: { 'someClass/setData', 'someClass/Data', 'someClass/Data', integer, top, top } stack: { 'someClass/Data' }
Stackmap Frame: bci: @2079 flags: { } locals: { 'someClass/setData', 'someClass/Data', 'someClass/Data', integer, 'java/lang/StringBuffer', 'java/lang/String' }スタック:{}