Java 在for循环中停止

Java 在for循环中停止,java,for-loop,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())

当我运行代码时,它总是在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());
    }

}
如何解决此问题以使其正常运行?

确保cell.isAvailable在应该时返回true。循环显示为跳过的唯一方式是收集单元格为空或没有可用的单元格。

这表明单元格为空。如果不是,我们只是猜测-请发布一个完整的程序

但是,我强烈建议您在if语句1周围添加大括号:

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

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

    }
}
哦,你可能需要一个返回或终止声明,否则一个囚犯将被分配到所有可用的牢房。事实上,这可能发生在你的第一个囚犯身上:非常仔细地检查程序的输出


1另一种选择是缩进if语句,但给出一些指示,表明您确实希望if语句在循环中。就我个人而言,我发现总是使用大括号很有帮助,因为这样你就不会在第一条语句之后意外地添加另一条语句,这条语句看起来像是循环的一部分,但实际上不是。在我看来,可读性是最重要的。

你确定你收集的单元格不是空的吗?我想:

在循环cells.size(如果是集合)和cells.length(如果是数组)之前打印单元格数 在进行任何检查之前,为每次迭代打印一些单元格信息提示:覆盖单元格对象上的toString并显示可用性等。
即使代码看起来是正确的,我也会用大括号将循环括起来。它使它更容易阅读


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

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

我会提到这一点,因为其他人没有:您应该学习如何使用与IDE捆绑在一起的调试器。它可以告诉您单元格数组是否为空。如果您使用的是Eclipse,这里有很多很棒的调试教程视频:

cells集合中有任何Cell实例吗?你是否有任何例外,或者只是没有达到你的预期?斯凯特在回答关于缺少休息的问题。我猜你的循环会因为缺少break语句而将所有单元格分配给一个囚犯。下一次调用assignCell方法时,将不再有可用的单元格,使其看起来似乎跳过了循环。为什么有人会强烈要求其他人坚持他的风格?@hacker:因为这样会减少bug。就这么简单。当前的代码很糟糕——它既不使用大括号也不使用缩进来表示if语句在for循环中。只是缩进是另一种选择,但根据我的经验,更简单的做法是坚持始终使用大括号的规则,并在从单语句循环更改为多语句循环时避免担心它。我同意使用大括号。然而,嵌套有点深,因此我将反转第一个if的逻辑,将嵌套减少一个级别,例如if!cell.isAvailable继续@黑客:如果OP使用了l1和ll的变量名,而不是囚犯和牢房,你会反对我强烈建议使用合理的名称吗?@hacker:我绝对不会对敦促和强烈鼓励人们遵循我所认为的最佳做法感到不安。这绝对会导致更少的错误,顺便说一句-我已经看到了范围界定的错误,这在正确的位置使用大括号是不会发生的。无论你称之为风格还是最佳实践,我认为鼓励人们遵循一条可能导致代码更可读、更易于理解和维护的路径没有错。这一点很好。调试器将快速显示列表是空的还是缺少break语句。amen。调试器可以在不到3秒钟的时间内解决这些问题。
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);

    }
}