Если-else работает, не переключайте

Я создаю приложение, которое имеет сетку изображений с текстом, и каждый из них открывает другое действие. Он отлично работает, но только для целей дизайна я хочу заменить if-else statements на if-else statements (который, как я полагаю, могу сделать), но он не работает. Сейчас мой рабочий код для установки метки на каждом изображении:

if(position == 0)
        textView.setText(R.string.zero);
    else if(position == 1)
        textView.setText(R.string.one);
    else if(position == 2)
        textView.setText(R.string.two);
    else if(position == 3)
        textView.setText(R.string.three);
    else if(position == 4)
        textView.setText(R.string.four);
    else if(position == 5)
        textView.setText(R.string.five);
ect....

Я хочу использовать:

switch(position)
case 0:
   textView.setText(R.string.zero);    
case 1:
   textView.setText(R.string.one);
case 2:
   textView.setText(R.string.two);    
case 3:
   textView.setText(R.string.three);
case 4:
   textView.setText(R.string.four);    

но когда я сделал это, ярлык был последним, который я определил (в моем примере это было бы "четыре" ). У меня также есть аналогичный код для каждого объекта, чтобы запустить другой intent с переменной position, однако это делает обратное и делает каждое намерение равным первому. Является ли мой синтаксис неправильным или это не сработает для моей ситуации?

Ответ 1

Вам нужно break; после каждого оператора в case, иначе выполнение будет стекать вниз (все случаи ниже того, который вы хотите, также вызываются), поэтому вы всегда получите последний случай.

switch(position) {
case 0:
    textView.setText(R.string.zero); 
    break; 
case 1:
    textView.setText(R.string.one);
    break; 
case 2:
    textView.setText(R.string.two);   
    break;  
case 3:
    textView.setText(R.string.three);
    break; 
case 4:
    textView.setText(R.string.four); 
    break; 
}

Здесь официальный учебник, объясняющий, когда и когда не использовать break;.

Ответ 2

После каждой ветки вам нужно break;:

switch (position) {
    case 0:
        textView.setText(R.string.zero);
        break; // <-- here
    // etc
}

Легитимное использование switch, когда вы не break, существуют, называются провалами; или потому, что вы return или throw.:

switch (someNumber) {
    case 0:
        return 0; 
        // no need for break here
    case 1:
        throw new IllegalArgumentException();
        // no need to break here
    case 2:
        System.out.println("Oh, I got two!");
        // fall through
    case 3:
        return 3;
    default:
        System.out.println("Meh")
        // No need to break: last possible branch
}

return -1;

вернет 3, даже если вы введете 2.

Но в противном случае вам нужно break.

Ответ 3

Использование инструкции break после каждого случая должно устранить проблему. Я также использовал бы инструкцию по умолчанию, а также после последнего случая.

Ответ 4

Это решение. Вы должны использовать break, чтобы избежать прохождения каждого случая:

switch(position)
case 0:
   textView.setText(R.string.zero);    
   break;
case 1:
   textView.setText(R.string.one);
   break;
case 2:
   textView.setText(R.string.two);  
   break;  
case 3:
   textView.setText(R.string.three);
   break;
case 4:
   textView.setText(R.string.four);    
   break;

Я бы рекомендовал прочитать документацию о оракуле о инструкции .

Ответ 5

Вам нужно использовать оператор break после операций с eace case. В операторе switch-case, если вы не используете инструкцию break, тогда все случаи после этого конкретного будут выполнены также

case 0:
   textView.setText(R.string.zero);    
   break;

Ответ 6

Не забудьте поставить break; после каждого случая: например:

switch(position){
case 0:
   textView.setText(R.string.zero);    
   break;
case 1:
   textView.setText(R.string.one);
   break;
case 2:
   textView.setText(R.string.two);    
   break;
case 3:
   textView.setText(R.string.three);
   break;
case 4:
   textView.setText(R.string.four);  
   break;
}

Ответ 7

В операциях Switch-case вам нужно поместить break; после каждого случая.

switch(position){
case 0:
   textView.setText(R.string.zero);    
   break;
case 1:
  textView.setText(R.string.one);
  break;
case 2:
  textView.setText(R.string.two);    
  break;
case 3:
  textView.setText(R.string.three);
  break;
case 4:
  textView.setText(R.string.four);  
  break;
default:
    System.out.println("not available");
}

Также вам нужно поместить по умолчанию:, потому что, когда все случаи неправильны, время выполнения по умолчанию: действие.

В операторе switch-case не забывается о break; и действии по умолчанию.

Ответ 8

Каждый оператор break завершает заключающий оператор switch. Поток управления продолжается с первым оператором, следующим за блоком коммутатора. Операторы break необходимы, потому что без них заявления в блоках коммутатора проваливаются: все инструкции после метки совпадения выполняются в последовательности, независимо от выражения последующих меток case, до тех пор, пока не встретится оператор break.

Коммутатор быстрее, чем оператор if-else

Нижняя строка: по умолчанию необязательно (работает как инструкция else в коммутаторе), Break является обязательным.

Интересный факт: вы не увидите никакой ошибки компиляции, даже если вы забыли разместить оператор break.

Ответ 9

Для switch требуется < <21 > , в каждом случае. Но в вашем случае это можно сделать гораздо проще, указав массив, как показано ниже.

String values = {R.string.zero, R.string.one, R.string.two, ... };

Используйте это для заполнения textView: textView.setText(values[position]);