遍历数组时出现Out of bounds error越界错误,求排查与修复方法
数组越界问题排查及修复方案
问题根因
- 循环边界逻辑错误:你声明的数组上限为20,数组索引默认从0开始,有效索引范围是0~19,而你写的循环条件是
i <= 20,当i自增到20时会直接访问超出数组范围的下标,触发越界错误。即使if判断中写了i <20的条件也无法规避,因为代码会先执行Name[i].ToLower()读取数组元素,再判断i是否小于20,数组越界已经先发生了。 - 额外逻辑漏洞1:用户输入搜索内容时你使用了
Console.Read(),该方法仅读取用户输入的第一个字符的ASCII值,转换为字符串后得到的是ASCII码对应的字符串,无法获取用户输入的完整游戏名称,会导致匹配逻辑完全失效。 - 额外逻辑漏洞2:当前代码每遍历一个元素不匹配就会输出「No match found」提示,即使目标匹配项存在也会先输出多条不匹配提示,不符合功能预期。
- 额外语法漏洞:
if(Answer == "Y")的代码块结束后直接写了清理逻辑的独立代码块,该代码块不管用户选Y还是N都会执行,不符合正常分支逻辑。
可行修复方案
- 修改循环边界条件为
i < 20,删除if判断中冗余的i <20条件 - 将读取搜索内容的方法换成
Console.ReadLine(),获取用户输入的完整字符串 - 新增匹配结果标记变量,遍历完全部数组后再统一输出是否匹配的提示
- 调整分支结构,把清理逻辑放到所有分支外,保证执行顺序符合预期
修正后可运行代码
Console.Clear(); // 变量声明可与你原有代码的定义对齐 string Answer = ""; string search = ""; // 以下三个数组为原有预定义数组,保留你自己的初始化逻辑即可 string[] Name = new string[20]; string[] Publisher = new string[20]; string[] Genre = new string[20]; Console.WriteLine("Would you like to search for an entry? Y/N."); Answer = Convert.ToString(Console.ReadLine())?.ToUpper() ?? ""; Console.Clear(); bool hasMatch = false; if (Answer == "Y") { Console.WriteLine("Please enter the game you'd like to search for: "); // 替换为ReadLine获取用户输入的完整内容 search = Convert.ToString(Console.ReadLine()) ?? ""; // 修正循环边界,避免越界 for (int i = 0; i < 20; i++) { // 跳过未赋值的空元素,避免空引用报错 if (string.IsNullOrEmpty(Name[i])) continue; if (search.Equals(Name[i], StringComparison.OrdinalIgnoreCase)) { Console.WriteLine("Match Found!"); Console.WriteLine(" "); Console.WriteLine($"Game: {Name[i]}. Publisher: {Publisher[i]}. Genre: {Genre[i]}"); hasMatch = true; } } // 遍历完全部元素后统一输出不匹配提示 if (!hasMatch) { Console.WriteLine("No match found! Check spelling."); } } // 全局清理逻辑 Console.WriteLine("Clearing lines"); Console.Clear(); Console.WriteLine("End of program. Thank you for logging data. Press any key to exit"); Console.ReadKey();
内容的提问来源于stack exchange,提问作者Raskunda
相关产品推荐
相关产品推荐

