C#列表索引越界异常处理:如何避免不存在位置的未处理错误?
解决会员序号超出范围的异常问题
首先,你的代码当前存在两个潜在异常点:输入非整数时的格式错误,以及序号超出会员数量时的索引越界。可以通过输入验证和边界检查直接解决,同时更建议优化数据存储结构,从根源减少出错可能:
1. 先处理输入异常的直接方案
先验证用户输入是否为有效整数,再检查序号是否在合法范围内:
Console.WriteLine("Which stored membership would you like to view? (e.g 1, 2..)"); // 验证输入是否为合法整数 if (!int.TryParse(Console.ReadLine(), out int membChoice)) { Console.WriteLine("请输入有效的数字序号!"); return; // 或执行重新输入的逻辑 } // 计算当前存储的会员总数(每个会员占3个列表元素) int totalMembers = membersList.Count / 3; // 检查序号是否在1到会员总数的范围内 if (membChoice < 1 || membChoice > totalMembers) { Console.WriteLine($"无效的序号!当前共有{totalMembers}个会员,请输入1-{totalMembers}之间的数字"); return; } // 验证通过后再输出会员信息 Console.WriteLine("Membership Entry " + membChoice); Console.WriteLine("Username: " + membersList[membChoice*3-3]); Console.WriteLine("Password: " + membersList[membChoice*3-2]); Console.WriteLine("Membership Type: " + membersList[membChoice*3-1].ToUpper());
2. 优化会员数据存储结构(更关键的改进)
你现在用单个列表存放所有会员的三个字段,不仅容易出现索引计算错误,还会导致维护困难。作为初学者,建议用类封装会员信息,逻辑会更清晰:
// 定义会员类,封装单个会员的所有信息 public class Member { public string Username { get; set; } public string Password { get; set; } public string MembershipType { get; set; } } // 替换原来的列表为Member类型的列表 List<Member> membersList = new List<Member>();
录入会员时直接添加对象:
// 示例:新增一个会员 var newMember = new Member { Username = "testUser", Password = "123456", MembershipType = "gold" }; membersList.Add(newMember);
查看会员的代码会更简洁,也不会有索引计算错误:
Console.WriteLine("Which stored membership would you like to view? (e.g 1, 2..)"); if (!int.TryParse(Console.ReadLine(), out int membChoice)) { Console.WriteLine("请输入有效的数字序号!"); return; } // 直接用列表Count获取会员总数,检查序号范围 if (membChoice < 1 || membChoice > membersList.Count) { Console.WriteLine($"无效的序号!当前共有{membersList.Count}个会员,请输入1-{membersList.Count}之间的数字"); return; } // 注意:列表是0索引,用户输入的是1开头的序号,需要减1 var selectedMember = membersList[membChoice - 1]; Console.WriteLine($"Membership Entry {membChoice}"); Console.WriteLine($"Username: {selectedMember.Username}"); Console.WriteLine($"Password: {selectedMember.Password}"); Console.WriteLine($"Membership Type: {selectedMember.MembershipType.ToUpper()}");
3. 简单实现会员信息的文件读写(满足老师要求)
对于初学者,用JSON格式读写是最易上手的方式,需要引用System.Text.Json命名空间:
写入文件(保存会员数据)
// 将会员列表序列化为JSON字符串并写入文件 string json = JsonSerializer.Serialize(membersList); File.WriteAllText("members.json", json);
读取文件(加载已存会员)
// 程序启动时加载文件中的会员数据 if (File.Exists("members.json")) { string json = File.ReadAllText("members.json"); membersList = JsonSerializer.Deserialize<List<Member>>(json) ?? new List<Member>(); } else { // 文件不存在则初始化空列表 membersList = new List<Member>(); }
内容的提问来源于stack exchange,提问作者jwykesss
相关产品推荐
相关产品推荐

