0

EMMA での作業から、正しく計測できず、クラスが壊れていることに気付きました。以下は、この問題を強調する簡単な例です。

public void showProblem() {
    try {
        for (int i = 0; i > 10; i++) {
            System.out.println(i);
        }
    } catch (final Throwable e) {
        System.err.println(e);
    }
}

計装クラス

public void showProblem()
{
    boolean[][] tmp3_0 = $VRc; if (tmp3_0 == null) tmp3_0; boolean[] arrayOfBoolean = $VRi()[1]; int i = 0; arrayOfBoolean[0] = true; tmpTernaryOp = tmp3_0;
    try
    {
        do
        {
            Throwable e;
            System.out.println(e);

            e++; arrayOfBoolean[1] = true; arrayOfBoolean[2] = true; } while (e > 10); arrayOfBoolean[3] = true;
    }
    catch (Throwable localThrowable1)
    {
        System.err.println(localThrowable1); arrayOfBoolean[4] = true;
    }
    arrayOfBoolean[5] = true;
}

eタイプをインクリメントしようとしていて、ループThrowable内で this を使用していることに注意してください。while

forループ内で try catch ロジックを移動すると、これが解決されることがわかりました。以下のコードで強調表示されているとおりです。

public void showProblem() {
    for (int i = 0; i > 10; i++) {
        try {
            System.out.println(i);
        } catch (final Throwable e) {
            System.err.println(e);
        }
    }
}

計装クラス

public void showProblem()
{
    boolean[][] tmp3_0 = $VRc; if (tmp3_0 == null) tmp3_0; boolean[] arrayOfBoolean = $VRi()[1]; int i = 0;
    Throwable e;
    arrayOfBoolean[0] = true; tmpTernaryOp = tmp3_0;
    do {
        try { System.out.println(i); arrayOfBoolean[1] = true;
        } catch (Throwable localThrowable1) {
            System.err.println(localThrowable1); arrayOfBoolean[2] = true;
        }
    i++; arrayOfBoolean[3] = true; arrayOfBoolean[4] = true; } while (i > 10);

    arrayOfBoolean[5] = true;
}

他の誰かがこれらの問題を経験しましたか?

設定

  • ウィンドウズ7 64
  • Java 1.6.0_24 64 ビット
  • エマ v2.0、ビルド 5312

解決

そのため、Eclipse がクラスに組み込んでいたデバッグ情報に問題があることが判明しました。これは、Android で生成された Ant スクリプトを使用して実行したときに観察されjavac、同様に問題を引き起こしました。これを無効にすると、EMMA はクラス ファイルを正常に処理できるようになりました。

この情報が他の人に役立つことを願っています。

4

1 に答える 1

1

Windows XP で Java JRE 1.6.0_35 および EMMA 2.0.5312 を問題なくテストしました。私にとって、逆コンパイルされたコード (JAD を使用) は次のようになります。

public void showProblem()
{
    boolean aflag[] = ($VRc != null ? $VRc : $VRi())[2];
    try
    {
        int i = 0;
        aflag[0] = true;
        do
        {
            aflag[2] = true;
            if (i > 10)
            {
                System.out.println(i);
                i++;
                aflag[1] = true;
            } else
            {
                break;
            }
        } while (true);
        aflag[3] = true;
    }
    catch (Throwable throwable)
    {
        System.err.println(throwable);
        aflag[4] = true;
    }
    aflag[5] = true;
}

PS: あなたのコード サンプルでは、​​実際にはループで使用i < 10したかったと思いますが、そうではありませんか? ;-)とにかく、あなたの状況を確実に再現するためにあなたのコードを使用しました。fori > 10

于 2013-08-10T13:00:19.780 に答える