Я не вижу ничего функционально неправильного с точки зрения того, что выполняется, но я просто потратил час на то, чтобы доказать, что мой код и компилятор делают то, что они предполагают.
Рассмотрим этот код:
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-вещь) ,
Это проблема с 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
в середине цикла.
Я сомневаюсь, что это будет исправлено в ближайшее время, поэтому вам просто нужно научиться жить с ним. Извините, я знаю, что это безумно.
Попробуйте Build -> Rebuild project, а затем Shift + F9. У вас устаревший код работает на приложении.
Вот что сработало для меня, по крайней мере, для перехода на исходный код Android SDK:
build.gradle
вашего приложения и установите значение compileSdkVersion
соответственно. compileSdkVersion
обратно.