停止for循环

Kar*_*ren -1 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());
    }

}
Run Code Online (Sandbox Code Playgroud)

我怎么能解决这个问题呢?

Jon*_*eet 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

事实上,我会尝试减少嵌套,并使用条件运算符:

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);

    }
}
Run Code Online (Sandbox Code Playgroud)

哦,你可能想要一个returnbreak声明,否则将为所有可用的单元分配一个囚犯.事实上,你的第一个囚犯可能会发生这种情况:仔细检查计划的输出!


1另一个替代方法是缩进if语句 - 但是给出一些迹象表明你确实意味着if语句在循环中.我个人觉得总是使用大括号是有帮助的,因为你不能在第一个看起来像循环的一部分之后不小心添加另一个语句,但事实并非如此.可读性是国王,国际海事组织.

  • @hacker:我绝对毫不犹豫地敦促并强烈鼓励人们遵循我认为的最佳做法.它绝对*确实*导致更少的错误,顺便说一句 - 我已经看到了范围的错误,在正确的地方根本不会发生支撑.无论你称之为风格还是最佳实践,我都认为鼓励人们遵循一条路径可能会导致代码更易读,从而更容易理解和维护. (6认同)
  • @hacker:因为它会导致更少的错误.就这么简单.当前代码很糟糕 - 它既不使用大括号*也不使用*缩进来表示`if`语句在`for`循环中.缩进是另一种选择,但根据我的经验,当你从单语句循环变为多语句循环等时,坚持使用"总是使用大括号"并且避免担心它的规则更简单. (2认同)
  • 我同意围绕"for"的大括号.然而,有了这个,嵌套有点深,所以如果将嵌套减少一个级别,我会颠倒第一个的逻辑,例如if(!cell.isAvailable())继续; (2认同)

jjn*_*guy 7

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

除此之外,我会检查以确保其中cells有物品.