indexOutOfBoundsException с удалением массивов

1

Я пишу космических захватчиков, сбивающих в java, и я почти делал фактические рабочие части, но я продолжаю получать эту ошибку:

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.remove(ArrayList.java:492)
at GamePanel.shotDelete(SpaceInvaders.java:261)
at GamePanel.shieldHit(SpaceInvaders.java:198)
at SpaceInvaders.actionPerformed(SpaceInvaders.java:44)
at javax.swing.Timer.fireActionPerformed(Timer.java:313)
at javax.swing.Timer$DoPostEvent.run(Timer.java:245)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
at java.awt.EventQueue.access$400(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:697)
at java.awt.EventQueue$3.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Я знаю, что это было задано раньше, но никто не хочет его решать. Мой код, в который эта ошибка возникает, есть:

public void shieldHit(){
    //enemy shots
    ArrayList<Integer>usedBadShot=new ArrayList<Integer>();
    for(int b=0;b<badShotList.size();b++){
        for(int i=0;i<shieldShape.length;i++){
            for(int j=0;j<shieldShape[i].length;j++){
                if(shieldShape[i][j]==1){
                    int xc=shieldLocX+j*6;
                    int yc=375+i*6;
                    if(badShotList.get(b)[x]<=xc+6&&badShotList.get(b)[x]>=xc&&badShotList.get(b)[y]<=yc+6&&badShotList.get(b)[y]>=yc){
                        //delete hit block
                        shieldShape[i][j]=0;

                        //randomly delete left or right of spot
                        int randint=(int)(Math.random()*101);
                        if(randint<=33){
                            shieldShape[i][j+1]=0;
                        }
                        else if(randint>33&&randint<67){
                            shieldShape[i][j-1]=0;
                        }
                        usedBadShot.add(b);
                    }
                }
            }
        }   
    }
    for(int i=0;i<usedBadShot.size();i++){
        badShotDelete(usedBadShot.get(i));
    }
    //user shots
    ArrayList<Integer>usedShot=new ArrayList<Integer>();
    for(int b=0;b<shotList.size();b++){
        for(int i=0;i<shieldShape.length;i++){
            for(int j=0;j<shieldShape[i].length;j++){
                if(shieldShape[i][j]==1){
                    int xc=shieldLocX+j*6;
                    int yc=375+i*6;
                    if(shotList.get(b)[x]<=xc+6&&shotList.get(b)[x]>=xc&&shotList.get(b)[y]<=yc+6&&shotList.get(b)[y]>=yc){
                        //delete hit block
                        shieldShape[i][j]=0;

                        //randomly delete left or right of spot
                        int randint=(int)(Math.random()*101);
                        if(randint<=33){
                            shieldShape[i][j+1]=0;
                        }
                        else if(randint>33&&randint<67){
                            shieldShape[i][j-1]=0;
                        }
                        usedShot.add(b);
                    }
                }
            }
        }   
    }
    for(int i=0;i<usedShot.size();i++){
        shotDelete(usedShot.get(i));
    }
}

Пожалуйста помоги

Теги:
arraylist
indexoutofboundsexception

1 ответ

2
Лучший ответ

При удалении элементов из ArrayList лучше сделать это от конца до начала. Таким образом, используемый индекс в цикле for не будет входить в индекс, который больше не может использоваться из-за удаленных данных.

  • 0
    Я отредактировал свой код так, чтобы теперь он выглядел следующим образом `for (int i = usedBadShot.size () - 1; i> 0; i -) {badShotDelete (usedBadShot.get (i)); } ... for (int i = usedShot.size () - 1; i> 0; i -) {shotDelete (usedShot.get (i)); } `но теперь он позволяет выстрелам пролетать сквозь барьеры без удаления. Пожалуйста помоги
  • 1
    Я только что исправил это, мне просто нужен оператор if, чтобы убедиться, что индекс больше 1, чтобы я мог вычесть из него 1. Спасибо за вашу помощь

Ещё вопросы

Сообщество Overcoder
Наверх
Меню