打印网格时,Java Index超出范围异常

时间:2018-05-22 06:05:11

标签: java for-loop arraylist

我正在尝试编写一个程序,将多个数组中的多米诺骨牌对象打印到网格中,但每当我运行它时,我都会得到索引超出范围的异常。我可以创建一个移动的奇异线,并在阵列中绘制每个多米诺骨牌,但是网格会产生以下结果:

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)
at DominoGame.drawTable(DominoGame.java:182)
at DominoGame.redraw(DominoGame.java:258)
at DominoGame.restart(DominoGame.java:119)
at DominoGame.<init>(DominoGame.java:91)
at DominoGame.main(DominoGame.java:262)

这是我的代码:

    public void drawTable(){
        int i = 0;
        if(this.table.isEmpty()){
        }
        else{
            for(int col = 0;col<this.table.size();col++){
                for(int row = 0;row<this.table.size();row++){
                    this.table.get(i).draw(TABLE_LEFT+DOMINO_SPACING*row, TABLE_TOP+DOMINO_HEIGHT*col);
                    if(this.table.get(i+1) != null){
                        i++;
                    }
                }
            }
        }

    }

非常感谢您的帮助

编辑:人们已经指出我的内循环中有不正确的增量。我已修复此问题,但我仍然收到错误。感谢

5 个答案:

答案 0 :(得分:3)

假设您的变量“i”应该在最多col *行时间递增,那么它的值最终可能超过表格的大小。

答案 1 :(得分:0)

您在内循环中增加col而不是row。此外,你以一种奇怪的方式迭代你的表:外部循环在col的所有元素上迭代一次,内部循环与row相同(上面提到的拼写错误),另外你有i,肯定会比表的大小增大,并用于从table获取元素。

答案 2 :(得分:0)

this.table.get(i+1) //if i+1 does not exist and you want to call it, you get error

Java Api - Methode get() in ArrayList

在描述中,您将看到,将在哪种情况下抛出错误

答案 3 :(得分:0)

您可以修改代码:

if(this.table.get(i+1) != null){
   i++;
}

if (i < this.table.size()-1 && this.table.get(i+1) != null) {
   i++;
}

当i = this.table.size() - 1时,this.table.get(i + 1)将引发IndexOutOfBoundsException。

答案 4 :(得分:0)

谢谢你的帮助。由于我的代码需要一个7宽的网格,我能够将这些代码放在一起:

public void drawTable(){
    if(this.table.isEmpty()){
    }
    else{
        int rowCount = 0;
        int colCount = 0;
        for(int i = 0;i<this.table.size();i++){
            if(i%7 == 0){
                rowCount++;
                colCount = 0;
            }
            this.table.get(i).draw(TABLE_LEFT+DOMINO_SPACING*colCount, TABLE_TOP+DOMINO_HEIGHT*rowCount); 
            colCount++;
        }
    }
}

这段代码完成了我想要的,在一行中打印7个多米诺骨牌,然后移动到下一个并打印另一个7.这可以用于任何网格大小只需将7更改为另一个数字。

我只是想再次感谢大家的帮助,这使得这个过程变得不那么理想了。