有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java 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;
        }
    }

    x = 10;
    y = 20;

    return 0;
}

打电话给

int theAnswer = getAnswer(6);

在运行代码之前,对包含return的两行进行断点,并尝试预测结果,从而预测将命中哪一行

正如你可能从我的问题语气中想象的那样,高亮显示了错误的行,但返回了正确的结果。如果你一步一步地看代码,它会跳很多次

是否有其他配置,以便显示正确的行?(我使用的是最新的Android Studio,我知道它可能不稳定,但我确信不久前我在Eclipse上也看到过类似的行为,但我从来没有花时间去追踪它;也许它是java的东西)


共 (3) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    这是dx的一个问题,它是转换Java的构建的一部分。将文件分类为。用于打包到Android中的dx文件。据此:

    https://code.google.com/p/android/issues/detail?id=34193

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

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

  3. # 3 楼答案

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

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