Почему эмулятор Android пропускает мое заявление о возврате? - PullRequest
3 голосов
/ 28 июля 2010

Я получаю неожиданное поведение в приложении Android 1.5 под эмулятором Windows и отлаживаю с помощью Eclipse.Вот обобщение того, что делает код:

if (someCondition) {
    System.out.println("got here");
    return "a";
}

if (someOtherCondition)
    return "b"

return "c";

Если я перебираю этот код с помощью отладчика, если someCondition истина, он выводит "получил здесь", но затем переходит к финалуоператор return , как будто он собирается выполнить эту строку.Из того, что я могу сказать, он возвращает «а», но это сбивает с толку, потому что кажется, что он собирается вернуть «с».

Если someCondition ложно, а someOtherCondition верно, отладчикпереходит к строке return "b" - он не переходит к последнему оператору возврата, а затем оставляет метод, как и ожидалось.

Как я уже говорил, кажется, что он всегда возвращает ожидаемое поведение, но тот факт, чтоотладчик перескочил на неправильную линию, и я погнался за фантомными ошибками.Полная перестройка, перезапуск Eclipse и перезапуск Windows - все это не решило проблему - ее можно полностью воссоздать.

Есть идеи?

Ответы [ 3 ]

4 голосов
/ 28 июля 2010

Помните, что ваша программа, которую вы выполняете и отлаживаете, не написана Java-кодом - это байт-код, который был скомпилирован из Java-кода.

Если вы шагаете по оптимизированному коду C ++, вы можете ожидать, что курсор будет перескакивать по всему коду, как глупый, в зависимости от того, насколько планировщик смог переставить вещи.

Java намного проще, но я бы предположил, что инструкции возврата все еще немного оптимизированы, т. Е. Часть очистки функции является общей, поэтому возврат всегда приводит вас туда.

Не слишком полагайтесь на точное положение курсора - вместо этого используйте отладочный вывод (который также быстрее на практике).

0 голосов
/ 24 декабря 2015

Я думаю, что вы столкнулись с одной из оптимизаций, которую инструмент dx выполняет для файлов классов.Короче говоря, в некоторых обстоятельствах возвраты объединяются.Вы можете увидеть больше информации об этом http://www.netmite.com/android/mydroid/2.0/dalvik/docs/debugger.html в разделе Известные проблемы и ограничения. Но, к сожалению, оттуда неясно, в каких именно случаях оптимизация вступит в силу, и до сих пор не ясно, почему один возврат объединяется, а другойкак в твоем примере ...

0 голосов
/ 28 июля 2010

просто убедившись: фактический код в виде точки с запятой после возврата "b" - верно?Отсутствующие точки с запятой всегда вызывают странность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...