【问题标题】:Processing IntList.remove() throws ArrayIndexOutOfBounds: 10 exception处理 IntList.remove() 抛出 ArrayIndexOutOfBounds: 10 异常
【发布时间】:2014-11-03 13:45:26
【问题描述】:

我正在尝试在 Processing 中制作一个小型射击游戏,当我单击鼠标按钮时,我创建了一些在屏幕上移动的子弹,当它们离开屏幕时它们应该消失,我使用 IntList我保留这样的值:(X1, Y1, X2, Y2, ...),我的问题是,当我在下面的代码中尝试删除项目符号的索引时,我随机得到一个ArrayIndexOutOfBounds: 10 异常,即使我在删除之前检查了 IntList 的大小。有什么帮助吗?

    for(i = 1; i < shots.size(); i += 2){
      shots.sub(i, bullet_speed);
      if(shots.get(i) + bullet_height <= border_size){
        shots.remove(i); //Problematic point
        println("Removed Y-pos, array's size: "+shots.size());
        shots.remove(i - 1);
        println("Removed X-pos, array's size: "+shots.size());
        i -= 2;
        continue;
      }
      rect(shots.get(i - 1), shots.get(i), bullet_width, bullet_height);
    }

编辑:
我想我找到了一个线索:当我在屏幕上达到 5 个子弹时,总是会发生异常(此时,镜头的大小变为 10)。

【问题讨论】:

  • shots.sub() 有什么作用?它会改变列表吗?
  • @eran shot.sub() 减少子弹的 Y 位置
  • 什么是 IntList?它是您创建的类还是某个库类?如果您创建了它,请包含它的代码。
  • @eran 据我了解,这是一个处理类。 processing.org/reference/IntList.html
  • 我建议您将调试打印移到引发异常的行之前,看看此时ishots.size() 的值是多少。

标签: java processing


【解决方案1】:

变化:

for(i = 1; i < shots.size(); i += 2){

收件人:

for(i = 0; i < shots.size(); i += 2){

List 的索引从 0 开始,而不是 1。由于您每次都加 2,因此它超出了 for 循环中的 i &lt; shots.size() 和您的 if-statement 的点,因为它只检查值 + 1,也不是值 + 2。

【讨论】:

  • 我的救星!这件事让我发疯了两天。还有一个问题:你知道ArrayIndexOutOfBounds: 10 中的10 代表什么吗?因为我也收到过一次ArrayIndexOutOfBounds: -2
  • 很高兴我能帮上忙。 10 代表导致错误的索引。在您的情况下,列表的大小为 10,它尝试执行 .remove(10);(数组和列表使用从 0 到长度为 1 的索引,因此对于大小为 10 的列表,它的索引为 0 到 9 [包括],和 10 会导致错误。-2 也会导致 ArrayIndexOutOfBoundsException,因为它也在 0 到 9 [包括] 的范围之外(负值总是会导致 ArrayIndexOufOfBoundsException,因为索引从 0 开始)。
  • 我不确定这是否能解决问题,因为如果您从 i=0 开始,shots.remove(i - 1) 在 i==0 时会给您一个 ArrayIndexOutOfBoundsException。
  • 好的,我以为我解决了这个问题,但我又遇到了异常...用 println() 检查了代码,要删除的索引小于 IntList 的大小,可能是什么别的?有没有办法可以跳过异常?
  • @Eran 我更改了代码以避免这种情况,但问题是另一个问题,请参阅我在问题中的编辑。
【解决方案2】:

这实际上很有趣,因为我认为 IntList 是动态的,因为据说 ArrayList 来自处理文档,如 Description 下的here 所见,正如@Eran 所建议的那样,我移至 ArrayList 进行测试,然后在Java文档中我发现我的初始声明shots = new IntList();我认为是变量实际上是一个初始容量为10的声明here,所以这就是为什么我得到ArrayIndexOutOfBounds: 10异常,现在我解决了声明shots = new IntList(20);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多