在 foreach 循环中抛出 IndexOutOfRangeException

Posted

技术标签:

【中文标题】在 foreach 循环中抛出 IndexOutOfRangeException【英文标题】:IndexOutOfRangeException thrown in foreach loop 【发布时间】:2013-07-30 16:43:17 【问题描述】:

我正在使用 Photon 服务器运行多人游戏,在每 100 多场游戏中,服务器停止响应输入 - 查看日志文件,我收到以下异常:

2013-07-30 12:31:24,918 [11] 错误 Lite.Room [(null)] - System.IndexOutOfRangeException:索引超出范围 大批。在 STSLib.Engine.handleInput(哈希表输入,Int32 playerId) 在 C:\Program Files (x86)\Photon\Photon src-server\STSServer\STSLib\Engine.cs:第 130 行

查看我的代码,我的引擎类的第 130 行是一个 foreach 循环:

foreach (Player p in players)

    Queue playerQueue = new Queue();
    returnTable.Add(p.playerId, playerQueue);       

其中 player 是我为代表(你猜对了!)游戏玩家而创建的一个类,而 player 是一个 Player 数组。 returntable,是我发送给客户端的其他数据的哈希表队列的哈希表,我只是用一个空队列实例化每个键。

foreach 循环被调用,并在游戏在这种情况下被破坏之前运行多次——也就是说,这个异常在游戏过程中开始被抛出。

谁能解释一下 foreach 循环如何抛出索引越界异常?

【问题讨论】:

你能粘贴整个foreach循环吗? players 可能是一个 IEnumerable,直到这个 foreach 循环才被评估。你应该创造球员吗? 以防万一更改玩家列表出现问题,您至少可以尝试this 使用array 永远不会发生这种情况,即使是并发也是如此。更准确地了解数据、类型和声明。还要指定是否使用任何并发。 玩家已经被实例化——这个异常在游戏过程中开始被抛出——在这个循环成功运行了几次之后 【参考方案1】:

它不应该...除非您使用并发并且在循环运行时在其他地方更改了 player 变量。

Afaik 无法在循环内更改播放器(我认为您会在该位置收到运行时错误,但不会在 foreach 循环上)。

【讨论】:

或者可能是懒惰的评价在这里咬他,比如:var players = otherPlayers.Select(x => myArray[x.Id]) 我添加了完整的循环代码。玩家数组没有被修改——我只是在为一个哈希表实例化值。 您确定没有代码与您发布的代码同时运行吗? 它几乎肯定是一个并发问题,我添加了一些更多的调试语句,但这种情况很少发生,我怀疑我会弄清楚一段时间。如果加入大厅的尝试失败,可能会重置玩家数组,但我会调查一下,感谢您的帮助。 也许您可以在循环中放置一个断言以检查长度是否正确(未更改)并在那时打印出列表,以便您可以检查哪个玩家已被删除。

以上是关于在 foreach 循环中抛出 IndexOutOfRangeException的主要内容,如果未能解决你的问题,请参考以下文章

为啥覆盖 Parallel.foreach 循环的 .NET 单元测试依赖于硬件?

Pandas 使用 If/Then/Else 语句在循环中抛出错误

为啥我的 foreach 循环与 users.json 文件中的键不匹配

队列ForEach循环抛出InvalidOperationException

按钮操作块内的 Foreach 循环抛出“Type() 不能符合视图”

在构造函数中抛出 ArgumentNullException?