尝试捕获异常块不起作用

时间:2013-12-07 12:27:40

标签: java exception arraylist try-catch

我的代码跳了一下,但我想要它做的是:

  1. 当运行另一天的公共void(在hive类中)时,for循环遍历一个arraylist并从中获取蜜蜂。然后它尝试在arraylist中的蜜蜂上使用bee.anotherDay()方法。

  2. 蜜蜂的anotherDay()方法运行来自蜜蜂类的eat()方法 - 将蜜蜂的年龄加1,然后每隔3天(从第11天开始)为蜂巢中的arraylist添加一个鸡蛋。

  3. 吃法 - 如果有足够的蜂蜜(2个或更多个单位)将采取2蜂蜜,如果蜜蜂健康是2或更少 - 将增加1.如果没有足够的蜂蜜,那么蜜蜂健康减少1,如果健康状况达到0,则抛出异常。

  4. 该例外被捕获在hive的anotherDay()方法中,该方法删除了具有健康状态0的蜜蜂。

  5. 通过使用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;
        }
    }
    

1 个答案:

答案 0 :(得分:2)

首先评论,这不是Exception的正确用法。您应该返回状态代码,可能是enum

第二条评论,从不 throw new Exception()。创建您自己的Exception课程,否则您将完全按照samne的方式处理可能被抛出的{strong>所有异常(NullPointerExceptionArrayIndexOutOfBoundsException等)。这是一个等待发生的错误。

现在解决你的问题了。您执行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