当我运行我的代码时,它总是停在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 :(得分: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);
}
}
哦,你可能在那里需要return
或break
声明,否则将会有一个囚犯被分配到所有可用的单元格。事实上,你的第一个囚犯可能会发生这种情况:非常仔细地检查计划的输出!
1 另一个替代方法是缩进if
语句 - 但是给一些指示你确实意味着if
语句是在循环。我个人认为总是使用大括号是有帮助的,因为你不能在第一个看起来之后不小心添加另一个语句,就好像它将成为循环的一部分,但事实并非如此。可读性是国王,IMO。
答案 1 :(得分:7)
即使代码看起来正确,我也会将循环括在括号中。它使阅读更容易。
除此之外,我会检查以确保cells
中有项目。
答案 2 :(得分:4)
我会提到这个,因为没有其他人:你应该学习如何使用与IDE捆绑在一起的调试器。它可以告诉您cell单元格是否为空。如果你正在使用Eclipse,可以在这里找到很棒的调试教程视频:http://eclipsetutorial.sourceforge.net/debugger.html
答案 3 :(得分:2)
你确定你的细胞集合不是空的吗?我会:
答案 4 :(得分:0)
确保cell.isAvailable()
在应该的时候返回true
。循环看起来“跳过”的唯一方法是集合cells
为空或者没有单元格“可用”。
答案 5 :(得分:-1)
首先,我会将for循环的内容放入{}