#java #android #eclipse
#java #Android #eclipse
Вопрос:
Недавно я начал работать с Eclipse для разработки Android. При отладке с помощью кода я заметил одно странное поведение (по крайней мере, по сравнению с Visual Studio): после нажатия инструкции return в середине функции она возвращается не сразу, а всегда переходит к последней инструкции return. Например:
String getTest(int i){
if (i == 0)
return "0";
return "-1";
}
Учитывая, что i = 0, после нажатия первой инструкции return вместо того, чтобы выходить из этой функции, она переходит к следующей инструкции return . Однако он возвращает «0», а не «-1». Итак, почему этот фиктивный шаг? Меня это сбивает с толку. Кто-нибудь может объяснить, почему?
Комментарии:
1. Вы, вероятно, знаете об этом — но в качестве дополнительного примечания, лучшая форма (более легкая для чтения и с меньшей вероятностью появления ошибок) включала бы фигурные скобки вокруг тела
if
инструкции. В этом случае вы не можетеreturn
выполнить это дважды, поэтому добавление фигурных скобок на самом деле не будет иметь большого эффекта. Технически, еслиif
в теле есть одна строка, вы можете отказаться от фигурных скобок вокруг этого тела — это не является неправильным. С другой стороны, если вы вставилиi ;
строку непосредственно перед второй инструкцией return и удалили все отступы в этом коде, было бы неоднозначно, что происходило на самом деле.
Ответ №1:
Это просто визуальная функция в отладчике eclipse, где она перемещается в конец функции перед завершением самой себя, независимо от того, где была инструкция return. ie:
line:1 String method(String i){
line:2 return i;
line:3 extra code here...
line:4 extra code here...
line:5 extra code here...
line:6 extra code here...
line:7 return "fake return";
line:8 }
Отладчик всегда будет переходить от строки 1 к строке 2, затем к строке 8, затем обратно к коду, который вызвал его в первую очередь, и он всегда будет возвращать i, никогда «ложный возврат».
надеюсь, это поможет.
Комментарии:
1. Я полагаю, вы хотели сказать «затем в строку 7», верно? Не сбивает с толку? У меня никогда не было этого ни в одном другом отладчике.
2. я не могу точно вспомнить, является ли его строка 7/8, хотя принципы те же. если бы вы добавили больше кода между двумя инструкциями return, вы бы увидели, что он перескакивает более чем на одну строку. Если бы вы добавили код между последней инструкцией return и закрывающим } , я сомневаюсь, что он попал бы во второй return.
3. Хорошо, если он переходит к строке 8 после строки 2, это нормально, и это было бы то же поведение в VS. Но переход к строке 7 после строки 2 сбивает меня с толку. В любом случае, я думаю, это не так важно.
4. Я не пробовал этот пример, но если это то, что вы видите, я думаю @Glenn.nz верно. Я также считаю, что отладчик Firebug делает то же самое, что поначалу также сбивало меня с толку.
Ответ №2:
Это связано с тем, что именно представляет собой «возврат» из функции. Хотя это зависит от платформы, возврат обычно должен:
- Скопируйте код возврата в хорошо известный регистр (EAX в x86)
- Удалите адрес возврата из стека записей активации
- Сбросьте указатель стека (и базовый указатель)
Отличается только возвращаемое значение, компилятор может выбрать однократную генерацию машинного кода (байтового кода в случае Java) и переход к нему из разных мест. Eclipse может показывать этот переход.
Комментарии:
1. Итак, это проблема eslipse или проблема java? Я никогда не видел этого в Visual Studio, используя VC , C # или VB.