C# 移除空字符数组或跳过空组 解决索引越界异常问题
问题根因
你遇到的IndexOutOfRangeException异常本质是字符分组中存在空数组:当用户未勾选对应字符集、或自定义输入内容为空时,对应分组调用ToCharArray()后得到的是长度为0的空数组,代码随机选中该分组时,访问数组任意索引都会触发越界。
你当前写的try-catch逻辑无法解决这个问题:空分组对应的lastCharIdx为-1,无论怎么重新生成随机索引,访问空数组都会抛出异常。
修复方案
最优方案是初始化字符分组时直接过滤掉所有空分组,从根源上避免随机选到空分组:
第一步:修改字符分组初始化逻辑
将原有的charGroups初始化逻辑替换为如下代码,自动过滤长度为0的空分组:
// 生成所有字符分组后直接过滤空分组 char[][] charGroups = new char[][] { CapitalCharacterSet.ToCharArray(), LowercaseCharacterSet.ToCharArray(), NumbersCharacterSet.ToCharArray(), IncludeCharacterSet.ToCharArray(), SpecialCharacterSet.ToCharArray() }.Where(g => g.Length > 0).ToArray(); // 增加校验:如果所有分组都为空,提前抛出提示/终止逻辑,避免后续报错 if (charGroups.Length == 0) { throw new InvalidOperationException("请至少选择一类字符用于生成结果"); }
后续的charsLeftInGroup、leftGroupsOrder初始化逻辑不需要改动,因为它们会自动基于过滤后的非空分组生成,后续随机选取分组时永远不会命中空分组,不会再触发越界异常。
可选优化:移除无效try-catch
既然已经从源头上避免了空分组,原代码里包裹赋值逻辑的try-catch已经没有作用,可以直接删除,减少不必要的性能损耗。
内容的提问来源于stack exchange,提问作者HelloMark
相关产品推荐
相关产品推荐

