Java打印多米诺骨牌网格时触发IndexOutOfBoundsException求助
解决多米诺网格绘制的IndexOutOfBoundsException问题
看起来你在网格绘制逻辑里踩了几个常见的索引错误坑,我来帮你拆解问题根源,再给出修复方案:
问题根源分析
先看你的报错:java.lang.IndexOutOfBoundsException: Index: 0, Size: 0——虽然你加了if(this.table.isEmpty())的判断,但后续循环逻辑本身就存在严重的越界风险,哪怕table不为空也会出问题:
循环终止条件完全错误
你外层和内层循环的终止条件都是this.table.size(),这意味着如果table里有N个多米诺对象,你会执行N×N次循环。但table只有N个元素,i会很快增长到超过table的最大索引(table.size()-1),调用table.get(i)自然会抛出越界异常。错误的索引递增判断
if(this.table.get(i+1) != null)这行代码本身就会引发越界:当i已经是最后一个元素的索引时,i+1会超出table的范围,调用get(i+1)直接就会抛异常,根本到不了判断null的步骤。而且ArrayList默认不会存储null(除非你主动添加),这个判断完全没必要。
修复后的代码方案
首先你需要明确你的网格行数和列数(不能用table的size来代替,这是核心错误),然后根据行列数计算每个网格对应的table索引。假设你的网格是固定的rows行和cols列,修复后的代码如下:
public void drawTable(){ if(this.table.isEmpty()){ return; // 空表直接返回,避免无效执行 } // 替换成你实际需要的网格行数和列数 final int GRID_ROWS = 3; final int GRID_COLS = 4; // 提前校验table元素数量是否匹配网格大小,规避后续错误 if(this.table.size() != GRID_ROWS * GRID_COLS){ throw new IllegalArgumentException("Table元素数量与网格尺寸不匹配"); } int currentIndex = 0; // 外层遍历列(对应垂直方向的位置) for(int col = 0; col < GRID_COLS; col++){ // 内层遍历行(对应水平方向的位置) for(int row = 0; row < GRID_ROWS; row++){ // 根据行列绘制对应的多米诺 this.table.get(currentIndex).draw( TABLE_LEFT + DOMINO_SPACING * row, TABLE_TOP + DOMINO_HEIGHT * col ); currentIndex++; // 每次循环后直接递增索引,无需额外判断 } } }
额外优化建议
- 如果你的网格尺寸是动态变化的,可以把行数和列数作为参数传入
drawTable方法,或者作为类的成员变量存储,不要硬编码。 - 提前校验table大小和网格尺寸的匹配性,能在开发阶段快速发现数据错误,避免运行时异常。
- 空代码块直接替换成
return,让代码更简洁易读。
内容的提问来源于stack exchange,提问作者corgifan2
相关产品推荐
相关产品推荐

