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

Java战舰游戏使用嵌套列表时触发IndexOutOfBoundsException求助

解决战舰游戏中放置舰船的IndexOutOfBoundsException问题

兄弟,我一眼就瞅出你构造方法里的问题了——这正是触发IndexOutOfBoundsException的根源!

问题分析

你创建棋盘的代码里有个关键误区:

public Board(){
    theSea = new ArrayList<ArrayList<ShipInterface>>(10);
    for(int i = 0; i < theSea.size(); i++){
        theSea.set(i, new ArrayList<ShipInterface>(10));
    }
}

这里new ArrayList<>(10)中的10是初始容量,不是实际包含的元素数量!刚创建完theSea时,它的size()返回的是0,所以下面的for循环根本不会执行。这导致theSea是空的,没有任何一行网格数据。之后你调用placeShip方法访问网格索引时,自然就会因为数组越界抛出异常。

修正后的构造方法

把构造方法改成这样,才能真正创建出10x10的游戏网格:

public Board(){
    theSea = new ArrayList<ArrayList<ShipInterface>>(10);
    // 循环10次,创建每一行
    for(int i = 0; i < 10; i++){
        ArrayList<ShipInterface> row = new ArrayList<>(10);
        // 给每一行填充10个占位元素(这里用null,你也可以换成自定义的空Ship实现)
        for(int j = 0; j < 10; j++){
            row.add(null);
        }
        theSea.add(row);
    }
}

这样修改后,theSea会被正确初始化为包含10个ArrayList的列表,每个子列表又包含10个元素,形成真正可用的10x10网格。后续访问0-9范围内的索引时,就不会再触发越界异常了。

额外注意点

  • 在placeShip方法里,要校验传入的坐标(行、列)是否在0-9的合法范围内,避免因为非法输入导致的越界。
  • 如果你的舰船有长度(比如战列舰占4格),还要检查放置时是否会超出网格边界(比如从(7,8)放置横向的4格舰船,就会超出列的范围),记得提前做边界判断。

内容的提问来源于stack exchange,提问作者 Brian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:49:39