IndexOutOfBoundsException при использовании вложенных списков - PullRequest
0 голосов
/ 26 апреля 2018

Я создаю основную игру в стиле линкора на 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);

Я новичок, так что извините, если мне не хватает некоторого очевидного фрагмента кода!

1 Ответ

0 голосов
/ 26 апреля 2018

Когда вы создаете новый список, он имеет размер 0 (значение, которое вы передаете конструктору ArrayList, равно начальной емкости - размер - это количество элементов, которое он в настоящее время содержит). Так что ваш конструктор Board() ничего не добавляет в Sea - цикл for повторяется ноль раз.

Следовательно, theSea остается пустым, и когда вы позже позвоните theSea.get(i) для любого значения i, вы получите ArrayIndexOutOfBoundsException.

Так что вы, вероятно, намереваетесь сделать

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 для 0 <= i < 10. Таким образом, ваш метод placeShip будет работать, но только до тех пор, пока каждый список заполнен y в диапазоне от 0 до 9 по порядку.

...