我的列表,库存中的索引仍然超出范围,即使我添加了一个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);
}
}
}
}
答案 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
太大,则应用程序崩溃。右手边永远不会被执行。