Падение коммутатора Java

1

Примечание. Используется 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 пропускается (НЕ выполняется). Поэтому я считаю, что это только функция отладчика. ЛОЛ. Это серьезно вводит в заблуждение. знак равно

  • 1
    @jhobbie: если вы добавляете return после каждого из этих случаев, то break - это недоступный код.
  • 1
    @jhobbie - у него есть return в конце каждого case . Добавление break только вызовет сообщение об ошибке компилятора.
Показать ещё 15 комментариев
Теги:

1 ответ

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, они могут быть не такими, как вы думаете.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню