我不知道出了什么问题

时间:2015-10-03 12:35:57

标签: java if-statement linked-list

if(handler.obj.isEmpty())
    handler.addObject(new Box(x, y, ID.Box));
else{
    for(int i = 0; i < handler.obj.size(); i++){
        Object tempObj = handler.obj.get(i);
        if (tempObj.getX() == x && tempObj.getY() == y && tempObj.getId() == ID.Box)
            handler.removeObect(tempObj);
        else
            handler.addObject(new Box(x, y, ID.Box));
    }
}

handler.addObject()语句中的else似乎无法访问或无效

来自评论:

public class Handler {
    LinkedList<Object> obj = new LinkedList<Object>();
    public void tick(){
        for (int i = 0; i < obj.size();i++){
            Object tempObj = obj.get(i);
            tempObj.tick();
        }
    }
    public void render(Graphics g){
        for (int i = 0; i < obj.size(); i++){
            Object tempObj = obj.get(i);
            tempObj.render(g);
        }
    }
    public void addObject(Object obj){
        this.obj.add(obj);
    }
    public void removeObect(Object obj){
        this.obj.remove(obj);
    }
}

2 个答案:

答案 0 :(得分:0)

我们来看看。假设第一次运行,x,y1,1。所以你添加Box(1,1)

下次运行时,我们假设x,y2,3。因此,请输入for循环:

  • i = 0:与x,y不一样,请输入else,然后添加Box(2,3)
  • i = 1:与x,y相同(是的,我们刚刚添加了它),因此请输入if并删除Box(2,3)

结果:Box已添加并再次删除。

哦,是的,调试器会告诉你同样的事情。

答案 1 :(得分:0)

您的问题是您的for循环结束于错误的位置。这会导致两种不良症状。

  • 首先,您为列表中匹配的每个元素添加新的Box一次,而不是仅添加一次。
  • 其次,一旦到达循环结束,您将删除刚刚添加的一些新Box对象。

我建议重写这样的方法。注意for循环在添加新对象之前如何结束 - 这可以确保最多添加一次对象。删除对象后还要注意return语句 - 这可以完成,因为一旦删除了对象,该方法就没有其他工作要做了。

public void addOrRemoveBox(int x, int y) {
    for(int i = 0; i < handler.obj.size(); i++){
        Object tempObj = handler.obj.get(i);
        if (tempObj.getX() == x && tempObj.getY() == y && tempObj.getId() == ID.Box) {
            handler.removeObect(tempObj);
            return;
         }
    }
    handler.addObject(new Box(x, y, ID.Box));
}

最后,您似乎编写了自己的类Object(否则此代码将无法编译)。这可能是一个坏主意,因为它会让你在你的 Object类和内置于Java的Object类之间感到困惑。我建议你重命名那个班。