Примечание. Используется Eclipse Luna (4.4 R) с ADT 23.0.2
Я следовал руководству Google о том, как разрабатывать приложения для Android, и по пути я решил запустить код шаг за шагом из любопытства, когда выполнение перескакивает, когда я нажимаю на панель действий. Я наткнулся на эту любопытную черту, и я не знаю, почему это происходит.
В принципе, код действия имеет этот оператор switch:
// Handle presses on the action bar items
switch (item.getItemId()) {
case R.id.action_search:
openSearch();
return true;
case R.id.action_settings:
openSettings();
return true;
default:
return super.onOptionsItemSelected(item);
}
Таким образом, я поставил точку останова на линии переключения, и когда я коснулся панели действий, коммутатор, как правило, перейдет к случаю, соответствующему значку иконы, который был затронут.
Однако выполнение также выполняется по умолчанию. Мое предыдущее понимание заключалось в том, что дефолт выполняется только в том случае, если ни один из случаев не согласован, поэтому почему случай по умолчанию также выполняется в этом сценарии? Не будет ли метод уже выйти после того, как встретит оператор возврата в каждом случае? Является ли это признаком операторов java switch?
Обновление: (Как предложено в комментариях ниже...)
Поэтому, чтобы проверить это, я объявил локальный var для хранения идентификатора, но я также добавил дополнительную строку в блок по умолчанию. Пересмотренный код приведен ниже:
// Handle presses on the action bar items
int id = item.getItemId();
switch (item.getItemId()) {
case R.id.action_search:
openSearch();
return true;
case R.id.action_settings:
openSettings();
return true;
default:
id = 0;
return super.onOptionsItemSelected(item);
}
Как упомянуто выше, выполняется один из случаев, а также возвращаемый по умолчанию возврат, но присваивание id в 0 пропускается (НЕ выполняется). Поэтому я считаю, что это только функция отладчика. ЛОЛ. Это серьезно вводит в заблуждение. знак равно
Код, который вы опубликовали, непредсказуемо перескакивает на случай по default
, вот простое доказательство:
public class SO {
public static boolean caseTest(int id) {
switch (id) {
case 0:
System.out.println("Case 0:");
return true;
default:
System.out.println("Default Case:");
return false;
}
}
public static void main(String[] args) {
System.out.println("Returned:"+caseTest(0));
//Prints:
//Case 0:
//Returned:true
System.out.println("Returned:"+caseTest(1));
//Prints:
//Default Case:
//Returned:false
}
}
Теперь для вещей, которые могут быть проблемой, взгляните на значения R.id.action_search
и R.id.action_settings
, они могут быть не такими, как вы думаете.
return
после каждого из этих случаев, тоbreak
- это недоступный код.return
в конце каждогоcase
. Добавлениеbreak
только вызовет сообщение об ошибке компилятора.