IndexOutOfBoundsException при добавлении элемента в ArrayList

276
19 февраля 2017, 09:05

Если список reddots:

ArrayList<Red> reddots =  new ArrayList();

В него добавляются элементы:

class DotListener extends InputListener {
    @Override
    public boolean touchDown(InputEvent event, float x, float y, int pointer, int button){
        event.getListenerActor().remove();
        float xx = event.getListenerActor().getX();
        float yy = event.getListenerActor().getY();
        int ind = ((int)xx - 46) / 69;
        if (count % 2 == 0) {
            Red r = new Red();
            r.setSize(30, 30);
            r.setPosition(xx, yy);
            r.setColor(Color.RED);
            reddots.add(ind, r);
            stage.addActor(r);
        } else {
            Blue b = new Blue();
            b.setSize(30, 30);
            b.setPosition(xx, yy);
            b.setColor(Color.BLUE);
            stage.addActor(b);
        }
        count++;
        return true;
    }
}

Почему код крашится? Если убрать reddots.add(ind, r), то крашиться не будет. Но мне нужно давать индекс каждой точке.

Классы Red и Blue наследуются от Dot.

Класс Dot:

class Dot extends Actor { //invisible
    @Override
    public void draw(Batch batch, float parentAlpha) {
        Color batchColor = batch.getColor();
        final float r = batchColor.r;
        final float g = batchColor.g;
        final float b = batchColor.b;
        final float a = batchColor.a;
        Color dotColor = getColor();
        batch.setColor(dotColor.r, dotColor.g, dotColor.b, dotColor.a * parentAlpha);
        batch.draw(dotimg, getX(), getY(), getWidth(), getHeight());
        batch.setColor(r, g, b, a);
    }
}

Ошибка в консоли:

E/AndroidRuntime: FATAL EXCEPTION: GLThread 151 Process: com.mygdx.game, PID: 2941 java.lang.IndexOutOfBoundsException: Index: 9, Size: 0 at java.util.ArrayList.add(ArrayList.java:457) at com.mygdx.game.MyGdxGame$DotListener.touchDown(MyGdxGame.java:48) at com.badlogic.gdx.scenes.scene2d.InputListener.handle(InputListener.java:56) at com.badlogic.gdx.scenes.scene2d.Actor.notify(Actor.java:182) at com.badlogic.gdx.scenes.scene2d.Actor.fire(Actor.java:147) at com.badlogic.gdx.scenes.scene2d.Stage.touchDown(Stage.java:282) at com.badlogic.gdx.backends.android.AndroidInput.processEvents(AndroidInput.java:375) at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:457) at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1548) at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1259) E/AndroidGraphics: waiting for pause synchronization took too long; assuming deadlock and killing

Answer 1

Вы создаёте пустой список:

ArrayList<Red> reddots = new ArrayList();

Размер (size) по умолчанию у него 0.

Когда вы пытаетесь добавить элемент в список на определённую позицию, происходит такая проверка:

if (index > size || index < 0)
    throw new IndexOutOfBoundsException(outOfBoundsMsg(index));

Так как index в вашем случае равен 9 (судя по stacktrace), а размер - 0, то в итоге пробрасывается исключение.

Вариантов решения проблемы в данной ситуации как минимум два:

  1. Добавлять элементы не на конкретный индекс, а в конец списка:

    reddots.add(r);
    
  2. Если всё же нужно добавлять на определённый индекс, то стоит позаботиться о размере списка при его создании:

    int dotsCount = 1000;
    Red[] dummy = new Red[dotsCount];
    ArrayList<Red> reddots = new ArrayList<>(Arrays.asList(dummy));
    

На всякий случай уточню зачем городить такой код:

  • Если просто создать ArrayList, задав ему initialCapacity, то size его по-прежнему будет 0 и IndexOutOfBoundsException снова появится.
  • Если сделать List<Red> reddots = Arrays.asList(dummy);, то при попытке добавить элемент в список будет проброшено UnsupportedOperationException.
READ ALSO
смена iframe по клику

смена iframe по клику

есть 7 кнопок и 1 iframe, кликая по каждой должен меняться src в iframe

306
Галерея для сайта

Галерея для сайта

Как сделать так чтобы изображения разного размера в галереи отображались с одинаковой высотой и ширинойТо есть чтобы они автоматически...

255
как убрать по бокам белые полосы css [требует правки]

как убрать по бокам белые полосы css [требует правки]

Добрый день! как можно убрать белые полосы с картинок тут ссылка на страничку галереи

510
Фиксированное меню при прокрутке

Фиксированное меню при прокрутке

Добрый день всемПрошу помощи в довольно таки простом задании, но самостоятельно найти ответ не получается

252