2009-09-14 2 views
-1

Когда я запускаю свой код, он всегда останавливается в цикле for и пропускает его.Останавливает цикл for

public void assignCell() 
{ 
    Prisoner prisoner = prisoners.get(id-1); 
    for(Cell cell : cells) 
    if(cell.isAvailable()) 
    { 
     cell.allocate(prisoner); 
     String bunk = null; 
     if(cell.isEven()) 
     { 
      bunk = "top bunk of cell"; 
     } 
     else 
     { 
      bunk = "only bunk of cell"; 
     } 
     System.out.println("\t\t" + prisoner.nameToString() + " is in the " + bunk + cell.toString()); 
    } 

} 

Как я могу исправить это, чтобы он прошел?

+0

Есть ли какие-либо экземпляры 'Cell' в коллекции' cells'? Вы получаете какие-то исключения, или просто не делаете то, что ожидаете? – Welbog

+0

Скит на что-то с его ответом о пропавшем перерыве. Я собираюсь догадаться, что ваша петля проходит и назначает все ячейки одному заключенному из-за отсутствия инструкции break. В этом случае больше не будет доступных ячеек в следующий раз, когда вы вызовете метод assignCell, чтобы он пропустил цикл. –

ответ

0

Удостоверьтесь, что cell.isAvailable() возвращает true, когда предполагается. Единственный способ, по которому цикл может быть пропущен, - это если коллекция cells пуста или ни одна из ячеек не доступна.

7

Это означает, что cells пуст. Если это не так, мы просто догадываемся - отправьте полную программу.

Однако, я бы сильно призываю вас, чтобы добавить фигурные скобки вокруг if заявление :

public void assignCell() 
{ 
    Prisoner prisoner = prisoners.get(id-1); 
    for(Cell cell : cells) 
    { 
     if(cell.isAvailable()) 
     { 
      cell.allocate(prisoner); 
      String bunk = null; 
      if(cell.isEven()) 
      { 
       bunk = "top bunk of cell"; 
      } 
      else 
      { 
       bunk = "only bunk of cell"; 
      } 
      System.out.println("\t\t" + prisoner.nameToString() 
           + " is in the " + bunk + cell); 
     } 
    } 
} 

На самом деле, я бы тогда попытаться уменьшить вложенность и использовать условный оператор тоже :

public void assignCell() 
{ 
    Prisoner prisoner = prisoners.get(id-1); 
    for(Cell cell : cells) 
    { 
     if(!cell.isAvailable()) 
     { 
      continue; 
     } 
     cell.allocate(prisoner); 
     String bunk = cell.isEven() ? "top bunk of cell" : "bottom bunk of cell"; 
     System.out.println("\t\t" + prisoner.nameToString() 
          + " is in the " + bunk + cell); 

    } 
} 

О, и вы, вероятно, хотите return или break ул там, в противном случае один заключенный будет назначен всем доступным ячейкам. Действительно, это может произойти с вашим первым заключенным: очень внимательно проверьте выход программы!


Другой альтернативой является только отступа if заявление - но дать некоторые признак того, что вы действительно имеете в виду if заявление, чтобы быть в курсе. Лично мне всегда полезно использовать фигурные скобки, так как тогда вы не можете случайно добавить другой оператор после первого, который выглядит, как если бы он был частью цикла, но это не так. Читаемость - король, ИМО.

+1

Почему один * сильно * призывают кого-то еще придерживаться его стиля? –

+0

Я считаю, что вы имеете в виду выражение «для». –

+2

нет, он предназначенный * вокруг * если заявление. –

2

Вы уверены, что ваша коллекция ячеек не пуста? Я хотел бы:

  1. печати количество клеток до цикла (cells.size(), если это коллекция, cells.length, если это массив)
  2. печати некоторой информация ячейки для каждой итерации перед вы делаете какие-либо проверки (подсказка: переопределите toString() на объекте ячейки и отобразите доступность и т. д.)
7

Несмотря на то, что код выглядит правильно, я бы включил петлю в фигурные скобки. Это значительно облегчает чтение.

Кроме того, я бы уточнил, что у cells есть элементы.

-1

Для начала я бы поставил содержимое для цикла в {}

4

Я упоминаю об этом, так как никто другой не имеет: вы должны научиться использовать отладчик, который поставляется вместе с вашей IDE. Он может сказать вам, если ваш массив ячеек пуст.Если вы используете Eclipse, есть отличные видеоролики для отладки, доступные здесь: http://eclipsetutorial.sourceforge.net/debugger.html

+0

Хороший вопрос. Отладчик быстро показывает вам, является ли список пустым или есть отсутствующий оператор break. –

+0

amen. Такие вопросы - это то, что отладчик будет решать менее чем за 3 секунды. –

Смежные вопросы