我正在用Java构建一个基本的战舰式游戏,并使用嵌套列表来表示游戏网格。但是,当我试图放下一艘船时,我一直收到IndexOutOfBoundsException。
游戏板的构造函数如下
public Board(){
theSea = new ArrayList<ArrayList<ShipInterface>>(10);
for(int i = 0; i < theSea.size(); i++){
theSea.set(i, new ArrayList<ShipInterface>(10));
}
}
放置船舶的方法如下:
public void placeShip(ShipInterface ship, Position position, boolean isVertical) throws InvalidPositionException, ShipOverlapException{
for(int i=0; i<ship.getSize(); i++){
theSea.get((position.getX()-1) + i).set(position.getY()-1, ship);
}
}
但是,我在第theSea.get((position.getX()-1) + i).set(position.getY()-1, ship);
行
我是初学者,如果我遗漏了一些明显的代码,我很抱歉!
答案 0 :(得分:5)
创建新列表时,它的大小为0(传递给ArrayList
构造函数的值是初始容量 - size 是它当前包含的元素数量)。所以你的Board()
构造函数不会向theSea添加任何东西 - for
循环被重复零次。
因此,theSea
仍为空,当您稍后致电theSea.get(i)
以获取 i
的任何值时,您会获得ArrayIndexOutOfBoundsException
。< / p>
所以你可能打算做
public Board(){
theSea = new ArrayList<ArrayList<ShipInterface>>(10);
for(int i = 0; i < 10; i++){
theSea.add(new ArrayList<ShipInterface>(10));
}
}
现在注意theSea
包含10个空列表;即theSea.get(i)
将返回0 <= i < 10
的大小为0的列表。因此,只有每个列表的placeShip
填充y
到0
,您的9
方法才有效。