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并在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 < 10for循环中使用,不是i > 10,不是吗?;-) 无论如何,我使用您的代码只是为了确保重现您的情况。

于 2013-08-10T13:00:19.780 回答