【发布时间】:2014-10-17 01:55:09
【问题描述】:
我有一些类似于下面代码的代码。它有点复杂,但基本上在我的游戏过程中似乎随机出现IndexOutOfRange 异常。
当我阅读更多详细信息时,它说异常发生在参数“index”上(我没有那个名字,所以我认为它可能来自List<Rectangle>)。
void Update()
{
CurrentIndex++
if(CurrentIndex > EndFrame)
{
CurrentIndex = StartFrame;
}
}
public override Rectangle GetSize(Vector2 position)
{
//Exception occurs here
return new Rectangle(
(int)(position.X + MaxCharacterSize.X - AnimationList[CurrentFrame].BoundingBox.Width),
(int)(position.Y + MaxCharacterSize.Y - AnimationList[CurrentFrame].BoundingBox.Height),
AnimationList[CurrentFrame].BoundingBox.Width,
AnimationList[CurrentFrame].BoundingBox.Height);
}
为什么会抛出异常?甚至很难调试,因为它似乎是随机发生的。 Update() 仅被 Timer.Elapsed 事件调用是否与此有关?
我将永远感激能回答它的人。
【问题讨论】:
-
好的,如果它再次被抛出,我可以尝试这样做。它每 20 分钟左右才被抛出一次。我认为它必须在我的 AnimationList 中。因为这是唯一需要一个名为 index 的参数的东西。
-
可能是多线程问题。如果线程 1 已执行
CurrentIndex++(这使其大于 EndFrame)但未执行CurrentIndex = StartFrame,并且线程 2 调用 GetSize,它将尝试访问数组末尾。 -
参数索引故障不是索引变量。参数索引表示该对象本身的索引。数组和列表都有索引。示例 listItem[0] 将获取对象索引 0 处的实例。错误发生在哪一行?这将告诉您什么对象给出了索引异常以及要调试的对象。
-
对象是AnimatedList。我传递给 [ ] 的索引。我认为正在发生的是索引增加到最大值。就在 GetSize 方法完成之前,计时器再次拍摄并递增它通过
-
您可以通过检查以确保索引不超过列表中对象的数量然后运行代码来避免遍历索引。
标签: c# exception timer indexing xna