从使用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;
}
还有其他人遇到过这些问题吗?
事实证明问题与eclipse构建到类中的调试信息有关。使用Android生成的ant脚本执行javac
时会出现这种情况,同样会导致问题。禁用此功能可使EMMA成功处理类文件。
我希望这些信息能够帮助他人。
答案 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
,不是吗? ;-)无论如何,我使用你的代码,以确保重现你的情况。