Java Android Studio调试器突出显示了错误的行

Java Android Studio调试器突出显示了错误的行,java,android,debugging,android-studio,Java,Android,Debugging,Android Studio,我看不出在执行什么方面有任何功能上的错误,但我只是浪费了一个小时来证明我的代码和编译器正在做他们应该做的事情 考虑以下代码: public int getAnswer(int a) { int retval = 18; int x = 25; int y = 50; while (a-- > 0) { if (a == 3) { retval = a; return retval;

我看不出在执行什么方面有任何功能上的错误,但我只是浪费了一个小时来证明我的代码和编译器正在做他们应该做的事情

考虑以下代码:

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的东西)。

尝试构建->重建项目,然后按住Shift+F9键。应用程序上运行的代码已经过时。

这是dx的问题,dx是将Java.class文件转换为.dx文件以打包到Android的构建部分。据此:

如果一个函数有多条返回路径,dx会将返回指令合并为一条返回指令,因此在调试过程中,调试器无法判断返回属于哪一行,并且无法跳转。这与我在尝试重现您的问题时看到的情况相对应:每次通过循环时,它都执行
if(a==3)
检查,跳转到末尾的
返回0
,然后跳回循环。你看到了最后的<代码>返回0 在循环的中间与RealTrave>代码>合并。


我怀疑这个问题很快就会得到解决,所以你可能需要学会接受它。抱歉,我知道这有点疯狂。

以下是对我有用的东西,至少对于进入Android SDK源代码:

  • 安装SDK平台Android SDK源以准确了解开发过程中运行的Android版本的API级别(使用页面了解设备的API级别)
  • 编译你的应用程序,使之与该版本完全一致。例如,在Android Studio中,打开应用程序的
    build.gradle
    文件,并相应地设置
    compileSdkVersion
    的值
  • 调试您的应用程序。当您进入Android SDK源代码时,应该会看到正确的行
  • (可选)在部署前使用最新SDK重新编译。换句话说,更改
    编译dkversion
    返回

  • 不,不是那样的。清理、重建、重新制作、移动代码也只是为了它——没有区别。我创建了一个新的测试项目只是为了检查它,我正在实际的设备上运行它,而不是在模拟器上运行它。试试看!我在android开发中使用intellij IDEA(这是相同的)已经有好几年了,而您所描述的问题只有在我面对过时的代码时才出现。也许您正在调试库代码?如果没有,那么很抱歉,我不知道你可能会怎么做。不,我只是用Android studio创建了一个新的测试Android项目,将代码剪切粘贴到其中,然后从onCreate调用它,每次的行为都完全相同。谢谢。可惜这个dx“优化”不能在调试模式下解散。它不是一个优化。它是Dalvik虚拟机的二进制格式;你不能直接在Android上运行.class文件,而不是dx本身;我的意思是,它不能像在源代码中那样创建多个返回指令吗?这个答案很好。我也经历过这种情况。。。我明白这是有“理由”的,但这是完全不能接受的。这是dx中一个需要解决的严重设计问题。iOS和其他移动平台不存在这样的问题,这使得开发人员的生活非常困难。这也适用于none SDK代码。我切换了min API版本以匹配目标设备,现在调试器显示了正确的行。