You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java打印多米诺骨牌网格时触发IndexOutOfBoundsException求助

解决多米诺网格绘制的IndexOutOfBoundsException问题

看起来你在网格绘制逻辑里踩了几个常见的索引错误坑,我来帮你拆解问题根源,再给出修复方案:

问题根源分析

先看你的报错:java.lang.IndexOutOfBoundsException: Index: 0, Size: 0——虽然你加了if(this.table.isEmpty())的判断,但后续循环逻辑本身就存在严重的越界风险,哪怕table不为空也会出问题:

  1. 循环终止条件完全错误
    你外层和内层循环的终止条件都是this.table.size(),这意味着如果table里有N个多米诺对象,你会执行N×N次循环。但table只有N个元素,i会很快增长到超过table的最大索引(table.size()-1),调用table.get(i)自然会抛出越界异常。

  2. 错误的索引递增判断
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:21:10