我的代码跳了一下,但我想要它做的是:
当运行另一天的公共void(在hive类中)时,for循环遍历一个arraylist并从中获取蜜蜂。然后它尝试在arraylist中的蜜蜂上使用bee.anotherDay()方法。
蜜蜂的anotherDay()方法运行来自蜜蜂类的eat()方法 - 将蜜蜂的年龄加1,然后每隔3天(从第11天开始)为蜂巢中的arraylist添加一个鸡蛋。
吃法 - 如果有足够的蜂蜜(2个或更多个单位)将采取2蜂蜜,如果蜜蜂健康是2或更少 - 将增加1.如果没有足够的蜂蜜,那么蜜蜂健康减少1,如果健康状况达到0,则抛出异常。
该例外被捕获在hive的anotherDay()方法中,该方法删除了具有健康状态0的蜜蜂。
通过使用println几次,我认为实际发生的事情是我的异常被抛出并被捕获但是蜜蜂没有从arraylist中移除。
我的代码:
public void anotherDay(){ //anotherDay method in hive class
for(int i = 0;i<cells.size(); i++){
Bee bee = cells.get(i);
try{
bee = bee.anotherDay();
}catch(Exception e){
cells.remove(i);
}
cells.set(i, bee);
}
}
public Bee anotherDay() throws Exception{ //anotherDay mehtod in my Queen class (subclass of Bee}
eat();
age++;
if(age%3 == 2){
hive.addBee(new Egg());
}
return this;
}
public boolean eat() throws Exception{
if(hive.honey >= 2){
hive.takeHoney(2);
if(health == 3){
}else{
health= health++;
}
return true;
}else{
health = health -1;
if(health == 0){
throw new Exception();
}
return false;
}
}
答案 0 :(得分:2)
首先评论,这不是Exception
的正确用法。您应该返回状态代码,可能是enum
。
第二条评论,从不 throw new Exception()
。创建您自己的Exception
课程,否则您将完全按照samne的方式处理可能被抛出的{strong>所有异常(NullPointerException
,ArrayIndexOutOfBoundsException
等)。这是一个等待发生的错误。
现在解决你的问题了。您执行从i
删除索引为List
的项目,但始终再次将其重新添加回{{1} }。
在循环播放时,切勿从set
中删除项目。实际上,除非必须,否则永远不要按索引遍历集合。
使用Collection
方法Iterator
。这是在循环时从集合中删除的唯一(几乎唯一)安全方法。
remove
您无需另外一天返回final Iterator<Bee> myIter = cells.iterator();
while(myIter.hasNext()) {
final Bee bee = myIter.next();
try{
bee.anotherDay();
}catch(Exception e){
myIter.remove();
}
}
方法,也无需将this
中的引用替换为完全相同的引用。
查看您的List
方法,可以进行相当多的整理;我会推荐这个:
eat
即。你的很多作业都很混乱。如果您public boolean eat() throws Exception{
if(hive.honey >= 2){
hive.takeHoney(2);
if(health < 3){
health++;
}
return true;
}
health -= 1;
if(health == 0){
throw new BeeOutOfHealthException();
}
return false;
}
else
,则不需要return
。你的嵌套if
有点奇怪 - 有一个空语句肯定是代码味道。
此外,从if
获取蜂蜜的逻辑真的应该hive
如果蜂蜜的数量不能,则应该返回takeHoney
被采取。然后将您的方法减少到:
boolean