Останавливается на для цикла - PullRequest
0 голосов
/ 14 сентября 2009

Когда я запускаю свой код, он всегда останавливается на цикле 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());
    }

}

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

Ответы [ 6 ]

7 голосов
/ 14 сентября 2009

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

Кроме того, я бы проверил, чтобы в cells были предметы.

7 голосов
/ 14 сентября 2009

Это предполагает, что cells пусто.Если это не так, мы просто догадываемся - пожалуйста, опубликуйте программу complete .

Однако я бы настоятельно настоятельно рекомендовал бы вам добавить скобки вокруг вашего утверждения if 1 :

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, в противном случае одному заключенному будет присвоено всех доступных камер.Действительно, это может происходить с вашим первым заключенным: очень внимательно проверьте вывод программы!


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

4 голосов
/ 15 сентября 2009

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

2 голосов
/ 14 сентября 2009

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

  1. выводит число ячеек перед циклом (cell.size (), если это коллекция, cell.length, если это массив)
  2. выводит некоторую информацию о ячейке для каждой итерации , прежде чем делать какие-либо проверки (clue: override toString () для объекта ячейки и отображать доступность и т. Д.)
0 голосов
/ 14 сентября 2009

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

0 голосов
/ 14 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...