【问题标题】:In Java when I use ArrayList.get(i) I get an IndexOutOfBoundsException在 Java 中,当我使用 ArrayList.get(i) 时,我得到一个 IndexOutOfBoundsException
【发布时间】:2014-11-16 02:56:22
【问题描述】:

我是数组列表的新手,我觉得这个问题会有点复杂。我正在尝试制作智能碰撞检测器。构造函数通过接收起始坐标并将它们添加到每个 ArrayList 来开始一个多边形。 AddVertex() 方法为每个方法添加另一组坐标,End() 方法在第一个坐标的位置添加另一对坐标。然后我有一个名为 MouseCollision() 的方法,它返回一个布尔值并测试鼠标是否在多边形内。如果点是顺时针排列的,它会测试鼠标是否在形状内,但如果多边形是逆时针创建的,它将测试鼠标是否处于负形状。我正在使用一个不等式系统来确定鼠标是否在线的正确一侧,它在该部分变得复杂。

不管怎样,这是Detector.java的全文:

    package helpers;

import java.util.*;

import org.lwjgl.input.Mouse;

import static helpers.Artist.*;

public class Detector {

    List<Float> pX, pY, b, m;
    boolean colliding;

    public Detector(float pX, float pY) {;
        this.pX = new ArrayList<Float>();
        this.pY = new ArrayList<Float>();
        this.pX.add(pX);
        this.pY.add(pY);
    }

    public void AddVertex(float pX, float pY) {
        this.pX.add(pX);
        this.pY.add(pY);
    }

    public void End() {
        this.pX.add(pX.get(0));
        this.pY.add(pY.get(0));
    }

    public boolean MouseColliding() {
        colliding = true;
        this.m = new ArrayList<Float>();
        this.b = new ArrayList<Float>();

        for (int i=0; i<pX.size(); i++) {
            if (pX.get(i+1)-pX.get(i) == 0) {
                if (pY.get(i+1)-pY.get(i) > 0) {
                    if (Mouse.getX() >= pX.get(i)) {}
                    else colliding = false;
                } else {
                    if (Mouse.getX() <= pX.get(i)) {}
                    else colliding = false;
                }
            } else {
                m.add(pY.get(i+1) - pY.get(i)/pX.get(i+1) - pX.get(i));
                b.add(pY.get(i) - m.get(i)*pX.get(i));
                if (pX.get(i+1)-pX.get(i) > 0) {
                    if (HEIGHT - Mouse.getY() <= m.get(i)*Mouse.getX()+b.get(i)) {}
                    else colliding = false;
                } else {
                    if (HEIGHT - Mouse.getY() >= m.get(i)*Mouse.getX()+b.get(i)) {}
                    else colliding = false;
                }
            }
        }

        if (colliding) return true;
        else return false;
    }


}

每当我尝试运行程序时,我也会收到一条错误消息:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
    at java.util.ArrayList.rangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at helpers.Detector.MouseColliding(Detector.java:47)
    at data.Boot.<init>(Boot.java:57)
    at data.Boot.main(Boot.java:72)

我不知道我做错了什么,我去了第 47 行:b.add(pY.get(i) - m.get(i)*pX.get(i)); 而且我不知道问题是什么。 我知道 ArrayLists,我需要制作一个迭代器吗?我该怎么做?

【问题讨论】:

  • 如果您读取异常而不是仅仅将其视为“错误”,您实际上会得到答案。
  • 数组索引为零,因为您正在执行pX.get(i+1),当i 等于px.size() - 1 时,您会遇到off-by-one error
  • 我以前从未听说过所谓的“脱骨”。

标签: java indexoutofboundsexception


【解决方案1】:

将你的 for 循环更改为 for (int i=0; i&lt;pX.size()-1; i++) { 迭代应该是

px.size() - 1 所以你的pX.get(i+1) 不会导致IndexOutOfBoundsException 异常。

【讨论】:

  • 对,因为我有 5 分但只有 4 行我想调用,问题是,我试过了,但我仍然收到完全相同的错误消息。我做了一些工作来看看会发生什么,这很有趣。当我减去 2 时,它运行良好,但我的碰撞盒不起作用。 (顺便说一句,当我减去两个时,我的检测器有 3 个顶点,一个在 0、0、另一个在 64、0 和一个在 64、64。我还发现如果我只有 2 个顶点,并且只减去一个从 pX.size() 开始,它会运行而不会崩溃,但无论我做什么,碰撞检测器都不起作用。
  • 我想我快搞清楚了,很抱歉浪费了您的时间,因为我很愚蠢。基本上,出了问题的是我的程序测试以确保斜率不是无穷大,如果是这种情况,则在没有斜率的情况下进行不同的测试方法。问题是,当我的程序识别出无限斜线时,它没有给出 m 的值,所以当 pX 调用 m 时,它比 m 领先一步,所以它没有任何值。
  • 哦,太好了,你发现了问题所在,别以为你很傻,我们都是一样的
猜你喜欢
  • 2014-06-06
  • 2019-12-30
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
相关资源
最近更新 更多