停止for循环

时间:2009-09-14 19:46:24

标签: java for-loop

当我运行我的代码时,它总是停在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 个答案:

答案 0 :(得分:7)

这表明cells为空。如果不是,我们只是猜测 - 请发布一个完整的计划。

但是,我强烈敦促您在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);

    }
}

哦,你可能在那里需要returnbreak声明,否则将会有一个囚犯被分配到所有可用的单元格。事实上,你的第一个囚犯可能会发生这种情况:非常仔细地检查计划的输出!


1 另一个替代方法是缩进if语句 - 但是给一些指示你确实意味着if语句是在循环。我个人认为总是使用大括号是有帮助的,因为你不能在第一个看起来之后不小心添加另一个语句,就好像它将成为循环的一部分,但事实并非如此。可读性是国王,IMO。

答案 1 :(得分:7)

即使代码看起来正确,我也会将循环括在括号中。它使阅读更容易。

除此之外,我会检查以确保cells中有项目。

答案 2 :(得分:4)

我会提到这个,因为没有其他人:你应该学习如何使用与IDE捆绑在一起的调试器。它可以告诉您cell单元格是否为空。如果你正在使用Eclipse,可以在这里找到很棒的调试教程视频:http://eclipsetutorial.sourceforge.net/debugger.html

答案 3 :(得分:2)

你确定你的细胞集合不是空的吗?我会:

  1. 在循环之前打印单元格数(如果是集合,则为cells.size(),如果是数组则为cells.length)
  2. 在进行任何检查之前打印每个迭代的一些单元格信息(线索:覆盖单元格对象上的toString()并显示可用性等。)

答案 4 :(得分:0)

确保cell.isAvailable()在应该的时候返回true。循环看起来“跳过”的唯一方法是集合cells为空或者没有单元格“可用”。

答案 5 :(得分:-1)

首先,我会将for循环的内容放入{}