数组索引超出范围,停止其内部的for循环

时间:2016-04-09 13:39:27

标签: c# debugging for-loop unity3d unity5

我的列表,库存中的索引仍然超出范围,即使我添加了一个if语句,一旦i大于库存的数量,就会停止调用库存[i](所以一旦inventory [i]的ID等于-1(空项的默认ID值),并且number大于1(要绘制,则不会调用不存在的库存项)纹理只有一次)。我已经被困在这个bug上几个小时了,但我正在尝试的任何东西都在工作。应该总共有25个盒子,但只有11个盒子被抽出。我注意到当我将y的值更改为2时,错误会停止。我的代码的相关部分如下所示。为了便于阅读,我删除了其余部分。提前谢谢

void DrawInventory()
{
    int y = 5;
    int x = 5;

    for (int i = 0; i < y; i++) 
    {
        int number = 0;
        number++;
        for (int j = 0; j < x; j++) 
        {
            Rect rect = new Rect (new Vector2 (100 + (i * 60), 0 + (j * 60)), new Vector2 (50, 50));
            GUI.Box (rect, "");
            if (inventory [i].ID != -1 && number == 1 && i < inventory.Count) 
            {
                GUI.DrawTexture (rect, inventory [i].Icon);
                number++;
                print (inventory.Count);
            }   
        }
    }
}

Picture of Error

1 个答案:

答案 0 :(得分:1)

if (inventory [i].ID != -1 && number == 1 && i < inventory.Count)行中,inventory[i]之前评估i < inventory.Count

您可以通过i < inventory.Count进行首次检查来解决问题。

更新

在初步回答后,提问者问:

  

为什么我必须首先检查i < inventory.Count

这是因为&&运算符短路。这意味着,只要左侧是false,就不会再执行,因为false && whatever永远不会是true

因此,如果if (i < inventory.Count && inventory[i].ID)确实小于i

inventory.Count将永远不会执行右侧。

但是,如果条件为if (inventory[i].ID && i < inventory.Count),则首先执行左侧,如果i太大,则应用程序崩溃。右手边永远不会被执行。