недействительный java IndexOutOfBoundException - PullRequest
0 голосов
/ 21 ноября 2018

Не знаю почему, но время от времени, когда я запускаю свою программу, я получаю сообщение об ошибке ниже.Большую часть времени он работает нормально, но время от времени, когда я запускаю его, я получаю эту ошибку.Это не имеет никакого смысла, потому что, как вы видите, он пытается сослаться на index 1 of a size 3 array, что не должно быть проблемой.Массив является ArrayList, и я использую вложенный цикл for, не для каждого, а обычный стиль for(int i =0; i < size; i++), как во внутреннем, так и во внешнем цикле.Не уверен, что делаю что-то не так или сталкиваюсь с какой-то ошибкой.Я опубликую раздел кода, сообщающий об ошибке ниже.

Этот конкретный случай произошел здесь:

int x = fontArray.get(i).getPaintLetters().get(i2)[0]*Animator.pixMulti;

Но я видел это и в других вызовах массива в этом разделе.Это происходит только один раз, когда его называют в первый раз.Он работает в цикле и никогда не повторяется для этого экземпляра программы.Заранее спасибо.

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 1, Size: 3
        at java.util.ArrayList.rangeCheck(ArrayList.java:653)
        at java.util.ArrayList.get(ArrayList.java:429)
        at Engine.Board.paintFont(Board.java:461)
        at Engine.Board.paintComponent(Board.java:332)
        at javax.swing.JComponent.paint(JComponent.java:1053)
        at javax.swing.JComponent.paintToOffscreen(JComponent.java:5223)
        at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1572)
        at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1495)
        at javax.swing.RepaintManager.paint(RepaintManager.java:1265)
        at javax.swing.JComponent._paintImmediately(JComponent.java:5171)
        at javax.swing.JComponent.paintImmediately(JComponent.java:4982)
        at javax.swing.RepaintManager$4.run(RepaintManager.java:824)
        at javax.swing.RepaintManager$4.run(RepaintManager.java:807)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
        at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:807)
        at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:782)
        at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:731)
        at javax.swing.RepaintManager.access$1300(RepaintManager.java:64)
        at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1720)
        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)

Вот блок кода, который сообщает об ошибке.

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    paintFont(g);


    Toolkit.getDefaultToolkit().sync();
}

private void paintFont(Graphics g){
    Graphics2D g2d = (Graphics2D) g;

    for(int i = 0; i < fontArray.size(); i++){
        Image img = fontArray.get(i).getImage();
        for(int i2 = 0; i2 < fontArray.get(i).getPaintLetters().size(); i2++){
            int x = fontArray.get(i).getPaintLetters().get(i2)[0]*Animator.pixMulti;
            int y = fontArray.get(i).getPaintLetters().get(i2)[1]*Animator.pixMulti;
            int xPaint = fontArray.get(i).getLetWpaint();
            int yPaint = fontArray.get(i).getLetHpaint();
            int imgX = fontArray.get(i).getPaintLetters().get(i2)[2];
            int imgY = fontArray.get(i).getPaintLetters().get(i2)[3];
            int imgXW = fontArray.get(i).getLetW();
            int imgYH = fontArray.get(i).getLetH();
            g2d.drawImage(img,x,y,x+xPaint,y+yPaint,imgX,imgY,imgX+imgXW,imgY+imgYH,this);
        }
    }
}

Вот часть кода, которую возвращает getPaintLetters.paintLetters - это то, что возвращается.

ArrayList<int[]> paintLetters = new ArrayList<int[]>();

private void setArray(){
paintLetters.clear();

Point point;
int fontX = x, fontY = y;
int currentChar = 0;
for(int i = 0; i < strArray.size(); i++){
    while(currentChar < strArray.get(i).length()){
        int lets[] = new int[4];
        point = setLet(strArray.get(i).charAt(currentChar));
        lets[0] = fontX;
        lets[1] = fontY;
        lets[2] = point.x;
        lets[3] = point.y;
        paintLetters.add(lets);
        fontX += 7;
        currentChar++;
    }
    currentChar = 0;
    fontX = x;
    fontY += 8;
}
strArray.clear();
}

public ArrayList<int[]> getPaintLetters() {
        return paintLetters;
}
...