簡體   English   中英

我需要有關 java.lang.IndexOutOfBoundsException 的幫助 - ArrayList

[英]I need help about java.lang.IndexOutOfBoundsException - ArrayList

我正在做一個關於吉他英雄克隆的項目。 當我運行我的游戲(只是概念)時出現錯誤: java.lang.IndexOutOfBoundsException

package tapnstrum2;

import java.awt.*;
import java.awt.event.*;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import javax.swing.*;

public class String1 extends JFrame implements ActionListener {
Image S1;
GNode G;
PlayIG P;
int m =0;

public String1(){
    ImageIcon S1i = new ImageIcon("D:\\JavaProject\\Graphic-library\\buttons\\String01.png");
    S1 = S1i.getImage();
}
public Image getImage(){
    return S1;
}

public void keyPressed(KeyEvent e) throws FileNotFoundException, InterruptedException{
    ArrayList GNodes = P.getGNodes();
    GNode GN = (GNode) GNodes.get(m);
    int key = e.getKeyCode();
    ImageIcon S1iExact = new ImageIcon("D:\\JavaProject\\Graphic-library\\buttons\\String01_Exact.png");
    ImageIcon S1iMissed = new ImageIcon("D:\\JavaProject\\Graphic-library\\buttons\\String01_Missed.png");
    if (key == KeyEvent.VK_F1){
        for (int i=0; i< GNodes.size(); i++){
        if (GN.getY()+47>=380 && GN.getY()+47<=420)
            S1 = S1iExact.getImage();
        else
            S1 = S1iMissed.getImage();
        }
    }
    m++;
if (m>=GN.size())
 m=0;
}
public void keyReleased(KeyEvent e){
        int key = e.getKeyCode();
        ImageIcon S1i = new ImageIcon("D:\\JavaProject\\Graphic-library\\buttons\\String01.png");
        if (key == KeyEvent.VK_F1){
           S1 = S1i.getImage();
        }
}

@Override
public void actionPerformed(ActionEvent ae) {
    repaint();
}

}

我試圖從一個從簡單文本文件中讀取的 ArrayList 中獲取圖像的邊界,每行只包含 0 或 1 個(1 是 drawImage,0 不是)並檢查邊界。 此錯誤的索引可能等於我按 F1 的次數。 盡管我試圖在最后一行中為 m 設置一個條件。

更新我的錯誤信息:

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 3, Size: 2
    at java.util.ArrayList.rangeCheck(ArrayList.java:653)
    at java.util.ArrayList.get(ArrayList.java:429)
    at tapnstrum2.String1.keyPressed(String1.java:28)
    at tapnstrum2.PlayIG$AL.keyPressed(PlayIG.java:98)
    at java.awt.Component.processKeyEvent(Component.java:6483)
    at javax.swing.JComponent.processKeyEvent(JComponent.java:2832)
    at java.awt.Component.processEvent(Component.java:6302)
    at java.awt.Container.processEvent(Container.java:2234)
    at java.awt.Component.dispatchEventImpl(Component.java:4881)
    at java.awt.Container.dispatchEventImpl(Container.java:2292)
    at java.awt.Component.dispatchEvent(Component.java:4703)
    at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1954)
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:806)
    at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1074)
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:945)
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:771)
    at java.awt.Component.dispatchEventImpl(Component.java:4752)
    at java.awt.Container.dispatchEventImpl(Container.java:2292)
    at java.awt.Window.dispatchEventImpl(Window.java:2750)
    at java.awt.Component.dispatchEvent(Component.java:4703)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    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)

如果有任何有用的東西,您可以在這里下載我的項目https://mega.co.nz/#F!ql80jDKY!fM91p7phB7LfhTs75rSK-Q

問題出在這一行:

GNode GN = (GNode) GNodes.get(m);

如果索引m > GNodes.size()那么它將拋出該異常。 您有兩個選擇:

  1. try / catch塊中添加該語句。
  2. 添加一個 if 語句:

     GNode GN = null; if (m > 0 && m < GNodes.size()) { GN = (GNode) GNodes.get(m); }

您需要檢查 m 是否小於此行中 GNodes ArrayList 的大小:

GNode GN = (GNode) GNodes.get(m); //NetBeans inform this line contain an error

該錯誤表明 m 超出了 ArrayList 的范圍,這僅意味着它等於或大於 ArrayList 的長度,或者小於 0。

例如,

當 m 是 3 並且你的ArrayList[x, y, z]

GNodes.get(m)嘗試獲取z之后的z ,該值不存在並導致 Java 拋出異常。

我發現了我的問題。 每次當我從 ArrayList 中刪除一個元素時,它后面的元素會自動向上推。 在我的程序中,每當一個節點到達框架底部時,它就會消失並從該 ArrayList 中刪除。 所以我需要檢查的索引只是 0,即 ArrayList 的第一個元素。 現在我可以修復了。 非常感謝大家幫我找出來。 :)

public void keyPressed(KeyEvent e) throws FileNotFoundException, InterruptedException{
    ArrayList GNodes = PlayIG.getGNodes();
    GNode GN = (GNode) GNodes.get(0);
    System.out.println("" + m + " " + GNodes);
    int key = e.getKeyCode();
    ImageIcon S1iExact = new ImageIcon("D:\\JavaProject\\Graphic-library\\buttons\\String01_Exact.png");
    ImageIcon S1iMissed = new ImageIcon("D:\\JavaProject\\Graphic-library\\buttons\\String01_Missed.png");
    if (key == KeyEvent.VK_F1){
            if (GN.getY()+47>=370 && GN.getY()+47<=420)
                S1 = S1iExact.getImage();
            else
                S1 = S1iMissed.getImage();

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM