Подтвердить что ты не робот

Отладчик 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, которую, как я понимаю, потенциально нестабилен, но я уверен, что некоторое время наблюдал подобное поведение в Eclipse, но я никогда не тратил время на его отслеживание, возможно, это Java-вещь).

4b9b3361

Ответ 1

Это проблема с dx, которая является частью сборки, которая превращает ваши файлы Java.class в файлы .dx для упаковки в Android. В соответствии с этим:

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

Если функция имеет несколько путей возврата, dx объединяет инструкцию return в одну команду возврата, поэтому во время отладки отладчик не может определить, к какой строке относится возврат, и что-то происходит. Это соответствует тому, что я вижу, когда пытаюсь воспроизвести вашу проблему: каждый раз через цикл он выполняет проверку if (a == 3), переходит в конец return 0 в конце и затем возвращается обратно в цикл. Вы видите, что последний return 0 объединяется с return retval в середине цикла.

Я сомневаюсь, что это будет исправлено в ближайшее время, поэтому вам просто нужно научиться жить с ним. Извините, я знаю, что это безумно.

Ответ 2

Попробуйте создать → Восстановить проект, а затем Shift + F9. У вас устаревший код работает на приложении.

Ответ 3

Вот то, что сработало для меня, по крайней мере, для входа в исходный код Android SDK:

  • Установите SDK-платформу и Источники для Android SDK для точно уровня API версии Android вы используете во время разработки (используйте страницу История версий Android, чтобы узнать, какой уровень API на вашем устройстве).
  • Скомпилируйте ваше приложение для точно этой версии. Например, в Android Studio откройте файл приложения build.gradle и установите значение compileSdkVersion соответственно.
  • Отладка вашего приложения. Когда вы переходите в исходный код Android SDK, вы должны увидеть правильную строку.
  • (необязательно) Перекомпилировать с помощью последнего SDK перед развертыванием. Другими словами, измените compileSdkVersion назад.