在执行的内容方面我看不出任何功能上的错误,但是我浪费了一个小时证明我的代码并且编译器正在做他们应该做的事情。
考虑以下代码:
public int getAnswer(int a) {
int retval = 18;
int x = 25;
int y = 50;
while (a-- > 0) {
if (a == 3) {
retval = a;
return retval;
}
}
x = 10;
y = 20;
return 0;
}
用
调用int theAnswer = getAnswer(6);
断开包含return
的两行并在运行代码之前,尝试预测结果,然后命中哪一行。
正如您可能从我的问题的基调中想象的那样,突出显示错误的行,但返回了正确的结果。如果您单步执行代码,它会在很多方面跳舞。
是否有任何可以配置不同的东西,以便显示正确的行? (我正在使用最新的Android Studio,我很欣赏它可能不稳定,但我确信我曾经在Eclipse上看过类似的行为,但我从来没有花时间跟踪它;也许它是一个java的东西)
答案 0 :(得分:43)
这是dx的一个问题,它是构建中将Java .class文件转换为.dx文件以便打包到Android中的一部分。根据这个:
https://code.google.com/p/android/issues/detail?id=34193
如果函数有多个返回路径,则dx将返回指令合并为单个返回指令,因此在调试期间,调试器无法判断返回属于哪一行并且事物会跳转。这与我在尝试重现您的问题时所看到的相对应:每次通过循环时它都会执行if (a == 3)
检查,最后跳转到return 0
,然后跳回到循环中。您看到最后return 0
与循环中间的return retval
合并。
我怀疑这种情况很快就会得到解决,所以你可能只需要学会忍受它。对不起,我知道这有点疯狂。
答案 1 :(得分:2)
尝试构建 - >重建项目,然后按Shift + F9。你已经过时了在应用程序上运行的代码。
答案 2 :(得分:2)
这对我有用,至少是为了进入Android SDK源代码:
build.gradle
文件并相应地设置compileSdkVersion
的值。compileSdkVersion
。