艾玛仪表类错误

时间:2013-08-06 15:51:32

标签: java eclipse ant code-coverage emma

从使用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;
}

还有其他人遇到过这些问题吗?

设置

  • Windows 7 64
  • Java 1.6.0_24 64位
  • Emma v2.0,build 5312

解决方案

事实证明问题与eclipse构建到类中的调试信息有关。使用Android生成的ant脚本执行javac时会出现这种情况,同样会导致问题。禁用此功能可使EMMA成功处理类文件。

我希望这些信息能够帮助他人。

1 个答案:

答案 0 :(得分: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;
}

P.S。:我想在您的代码示例中,您实际上想要在i < 10循环中使用for,而不是i > 10,不是吗? ;-)无论如何,我使用你的代码,以确保重现你的情况。