4

最近、プロジェクトを 1.7 から Java 1.8 にアップグレードしました。

クラスの 1 つでメソッドの一貫性のないスタックマップの例外が発生します。

メソッドで割り当てられていないローカル変数を初期化することで解決しましたが、Java 8 で未読変数を使用すると例外が発生する理由を説明してください。

使用している eclipse バージョン (Kepler SR 2 20140224-0627) に関連している可能性があります。

回避策

  1. 障害のあるコードを修正する前に、以前は「--xxSplitVerifier」(1.7) または「-noVerify」Jvm 引数を使用していました。

  2. 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' }スタック:{}

4

1 に答える 1