C# Unity循环判断后访问列表下一个元素仍报IndexOutOfRange异常
问题排查与解决方案
问题根源
你的边界判断条件阈值设置错误,差了1个单位的偏移:
- C#中列表的有效索引范围是
0 ~ 列表长度 - 1,只要下一个索引i+1大于等于keys.Count,就已经属于越界范围 - 你原有的判断
if (keys.Count < i + 1)只有当i+1比keys.Count大的时候才会触发,但当i+1等于keys.Count时判断不生效,此时访问keys[i+1]就会触发越界异常
举个实际例子验证:假设keys共有3个元素,keys.Count = 3,有效索引为0、1、2:
- 当
i = 2时,i+1 = 3,此时判断3 < 3结果为false,不会触发break - 后续执行
keys[3]直接超出有效索引范围,抛出异常
解决方案
不需要修改for循环的终止条件,根据你的业务场景可以选择两种修改方式:
方式1:保留break逻辑,修正判断条件
for (int i = 0; i < keys.Count; i++) { // 当下一个索引超出有效范围时直接跳出 if (i + 1 >= keys.Count) break; Key nextKey = keys[i + 1]; // 后续原有逻辑保持不变... }
方式2:不跳出循环,仅隔离nextKey访问逻辑
如果你的循环体中还包含对当前keys[i]的处理逻辑,不想因为提前break导致最后一个元素的处理逻辑丢失,可以用该方案:
for (int i = 0; i < keys.Count; i++) { // 这里可以保留你处理当前keys[i]的原有逻辑,最后一个元素也能正常执行 // ... // 只有存在下一个元素时才执行nextKey相关逻辑 if (i + 1 < keys.Count) { Key nextKey = keys[i + 1]; // 处理nextKey的逻辑 } }
该方案既不会触发越界,也不会影响你原有循环体里针对每个元素的处理逻辑,完全可以避免修改终止条件后其他部分运行不符合预期的问题。
内容的提问来源于stack exchange,提问作者MidnightCoffee
相关产品推荐
相关产品推荐

