【问题标题】:I need help about java.lang.IndexOutOfBoundsException - ArrayList我需要有关 java.lang.IndexOutOfBoundsException - ArrayList 的帮助
【发布时间】:2015-08-29 15:42:48
【问题描述】:

我正在做一个关于吉他英雄克隆的项目。当我运行我的游戏(只是概念)时发生错误: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

【问题讨论】:

    标签: java arraylist indexoutofboundsexception


    【解决方案1】:

    您需要检查 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 之后的值,该值不存在并导致 Java 抛出异常。

    【讨论】:

      【解决方案2】:

      问题出在这一行:

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

      如果索引m&gt; GNodes.size(),那么它将抛出该异常。你有两个选择:

      1. 将该语句添加到 try/catch 块中。
      2. 添加 if 语句:

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

      【讨论】:

      • @tom 喜欢添加下限吗?
      • @tom 啊,明白了!索引从 0 开始,对吗?所以应该是n-1。
      • 正确。 GNodes.size() 是最后一个可访问索引之上的一个元素。例如,一个有 4 个元素的列表的索引为 0 到 3。顺便说一句,它应该是 m &gt;= 0,因为也允许索引 0
      • @codehitman 在我尝试之后,我得到一个关于“GN”的 NullPointerException 错误
      • 您的问题是,m 可以包含无效值。原因之一就在这里:m&gt;GNodes.size()。所以你需要找到你设置/增加m的其他地方并检查它是否正确。
      【解决方案3】:

      我发现了我的问题。每次我从 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();
      
          }
      

      【讨论】:

        猜你喜欢
        • 2021-12-09
        • 2020-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-28
        • 2019-05-17
        相关资源
        最近更新 更多