2015-10-20 2 views
0

У меня есть следующий переключатель:коммутатор заявление терпит неудачу в гнездовой типа

Мой groupPosition является 0 и childPosition является 1:

switch (groupPosition) { 
      case 0: 
       switch (childPosition) { 
        case 0: 
         if (NetworkManager.isNetworkAvailable(this)) { 
          new UserAwayTask().execute(); 
         } else 
          Toast.makeText(this, "Network not available", Toast.LENGTH_LONG).show(); 
         break; 

        case 1: 
         selection = null; 
         selectionArgs = null; 
         break; 
        case 2: 
         selection = Employee.COL_COUNTRY + " IS ? COLLATE NOCASE"; 
         selectionArgs = new String[]{valueReceived}; 
       } 
      case 1: 
       selection = Employee.COL_DEPARTMENT + " IS ? COLLATE NOCASE"; 
       selectionArgs = new String[]{valueReceived}; 
       break; 
      case 2: 
       empIDList = GetAllTeamLeaders.teamLeaders(this, TeamLeader.COL_TEAMMEMBERID, TeamLeader.COL_TEAMLEADERNAME + " IS ? ", new String[]{valueReceived}); 
       selection = Employee.COL_EMPID + " IN (" + TextUtils.join(",", Collections.nCopies(empIDList.size(), "?")) + ")"; 
       selectionArgs = empIDList.toArray(new String[empIDList.size()]); 
       break; 
     } 

Но каждый раз, когда мой выбор: отдел IS? COLLATE NOCASE , а аргументы выбора - от случая 1 от внешнего переключателя.

Так что:

case 1: 
       selection = Employee.COL_DEPARTMENT + " IS ? COLLATE NOCASE"; 
       selectionArgs = new String[]{valueReceived}; 
       break; 

становится выполнен вместо:

case 2: 
         selection = Employee.COL_COUNTRY + " IS ? COLLATE NOCASE"; 
         selectionArgs = new String[]{valueReceived}; 

Однако если я комментирую Внешний коммутатор случай 1 и случай 2. Я получаю желаемый результат.

Что мне здесь не хватает?

+2

Вы пропускаете заявление перерыва для случая 0: – arados

+1

Вам нужна точка с запятой и 'break' после' switch' заявления в 'случае 0' или он перейдет к «случаю 1», когда он завершится. – lurker

ответ

3

Вы забыли добавить break для верхнего уровня case 0:

case 0: 
    switch (childPosition) { 
     case 0: 
      if (NetworkManager.isNetworkAvailable(this)) { 
       new UserAwayTask().execute(); 
      } else 
       Toast.makeText(this, "Network not available", Toast.LENGTH_LONG).show(); 
      break; 

     case 1: 
      selection = null; 
      selectionArgs = null; 
      break; 
     case 2: 
      selection = Employee.COL_COUNTRY + " IS ? COLLATE NOCASE"; 
      selectionArgs = new String[]{valueReceived}; 
      break; 
    } 
break; //¯\_(ツ)_/¯ 

Без break;, поток просто продолжается и переходит в следующий case блок, пока он не достигает break заявление (или до тех пор, пока не погаснет от switch).

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

+0

Я пропустил это! Funk! Спасибо mate – User3

+0

Fall-Through, я не могу выразить словами, насколько я благодарен за вас :) – User3

+0

Добро пожаловать. :-) –

1

Вы не нарушаете внешний корпус переключателя 0. Добавьте break в закрывающий кронштейн вашего внутреннего переключателя.

case 0: 
    switch (childPosition) { 
    // 
    } break; 
3

Ваш отсутствует перерыв:

switch (groupPosition) { 
    case 0: 
     switch (childPosition) { 
      ... 
     } 
     break; // <-- here 
    case 1: 
     selection = Employee.COL_DEPARTMENT + " IS ? COLLATE NOCASE"; 
     selectionArgs = new String[]{valueReceived}; 
     break; 
    case 2: 
     empIDList = GetAllTeamLeaders.teamLeaders(this, TeamLeader.COL_TEAMMEMBERID, TeamLeader.COL_TEAMLEADERNAME + " IS ? ", new String[]{valueReceived}); 
     selection = Employee.COL_EMPID + " IN (" + TextUtils.join(",", Collections.nCopies(empIDList.size(), "?")) + ")"; 
     selectionArgs = empIDList.toArray(new String[empIDList.size()]); 
     break; 
} 
Смежные вопросы